From a6d0b1451589339343f0641c273ab63e35b94afd Mon Sep 17 00:00:00 2001 From: dnns01 <git@dnns01.de> Date: Fri, 28 May 2021 18:19:15 +0200 Subject: [PATCH] Add schedule functionality --- .gitignore | 1 + .idea/misc.xml | 2 +- .idea/strolly.iml | 2 +- schedule.py | 65 +++++++++++++++++++++++++++++++++++++++++++++++ strolly.py | 2 ++ 5 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 schedule.py diff --git a/.gitignore b/.gitignore index 76c43dd..5d83ff2 100644 --- a/.gitignore +++ b/.gitignore @@ -121,3 +121,4 @@ GitHub.sublime-settings /text_commands.json /news.json /highscores.json +/schedule.json diff --git a/.idea/misc.xml b/.idea/misc.xml index 1917bfc..77dc05a 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,5 +3,5 @@ <component name="JavaScriptSettings"> <option name="languageLevel" value="ES6" /> </component> - <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (strolly)" project-jdk-type="Python SDK" /> + <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (strolly)" project-jdk-type="Python SDK" /> </project> \ No newline at end of file diff --git a/.idea/strolly.iml b/.idea/strolly.iml index 2f48cc7..f49df88 100644 --- a/.idea/strolly.iml +++ b/.idea/strolly.iml @@ -4,7 +4,7 @@ <content url="file://$MODULE_DIR$"> <excludeFolder url="file://$MODULE_DIR$/venv" /> </content> - <orderEntry type="jdk" jdkName="Python 3.8 (strolly)" jdkType="Python SDK" /> + <orderEntry type="jdk" jdkName="Python 3.9 (strolly)" jdkType="Python SDK" /> <orderEntry type="sourceFolder" forTests="false" /> </component> </module> \ No newline at end of file diff --git a/schedule.py b/schedule.py new file mode 100644 index 0000000..5c37c8d --- /dev/null +++ b/schedule.py @@ -0,0 +1,65 @@ +import json +import os +from datetime import datetime + +import discord +from aiohttp import ClientSession +from discord.ext import commands, tasks + + +async def get_schedule(): + async with ClientSession() as session: + auth = "kimne78kx3ncx6brgo4mv6wki5h1ko" + headers = {"client-id": f"{auth}", "Content-Type": "application/json"} + + async with session.post("https://gql.twitch.tv/gql", + headers=headers, + json={ + "query": "query {\r\n channel(name: \"indiestrolche\") {\r\n schedule {\r\n segments(includeFutureSegments: true) {\r\n id\r\n startAt\r\n title\r\n categories {\r\n displayName\r\n boxArtURL\r\n }\r\n }\r\n }\r\n }\r\n}"}) as r: + if r.status == 200: + return {segment["id"]: segment for segment in + (await r.json())["data"]["channel"]["schedule"]["segments"]} + return None + + +class Schedule(commands.Cog): + def __init__(self, bot): + self.bot = bot + self.update_schedule.start() + self.schedule_file = "schedule.json" + self.schedule = self.load() + + def load(self): + schedule_file = open(self.schedule_file, mode="r") + return json.load(schedule_file) + + def save(self): + schedule_file = open(self.schedule_file, mode="w") + json.dump(self.schedule, schedule_file) + + @tasks.loop(hours=1) + async def update_schedule(self): + new_schedule = await get_schedule() + + for id, segment in new_schedule.items(): + if id in self.schedule.keys(): + old_segment = self.schedule.get(id) + if old_segment["startAt"] != segment["startAt"]: + self.schedule[id] = segment + await self.announce_segment(segment, new=False) + else: + self.schedule[id] = segment + await self.announce_segment(segment) + self.save() + + async def announce_segment(self, segment, new=True): + channel = await self.bot.fetch_channel(int(os.getenv("DURCHSAGEN_CHANNEL"))) + url = segment['categories'][0]['boxArtURL'].replace('-{width}x{height}', '').replace("/./", "/") + startAt = datetime.strptime(segment["startAt"], "%Y-%m-%dT%H:%M:%SZ").strftime("%d.%m.%Y %H:%M") + title = "<:ja:836282702248411217> <:aa:836282738709233675> <:aa:836282738709233675> <:aa:836282738709233675> <:aa:836282738709233675>" if new else "Achtung Leute aufgepasst!!!" + description = "Wie geil ist es? Ein neuer Stream ist in den Kalender geglitten\n" if new else "Es gibt eine kleine Änderung im Programmablauf!\n" + embed = discord.Embed(title=title, description=description) + embed.set_thumbnail(url=url) + embed.add_field(name=segment["title"], value=segment['categories'][0]['displayName']) + embed.add_field(name="Wann?", value=startAt) + await channel.send(embed=embed) diff --git a/strolly.py b/strolly.py index 1b39238..b36a23a 100644 --- a/strolly.py +++ b/strolly.py @@ -8,6 +8,7 @@ from armin import Armin from leaderboard import Leaderboard from poll_cog import PollCog from roll_cog import RollCog +from schedule import Schedule # .env file is necessary in the same directory, that contains several strings. load_dotenv() @@ -21,6 +22,7 @@ bot.add_cog(PollCog(bot)) bot.add_cog(RollCog(bot)) bot.add_cog(Leaderboard(bot)) bot.add_cog(Armin(bot)) +bot.add_cog(Schedule(bot)) @bot.event -- GitLab