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