-
Notifications
You must be signed in to change notification settings - Fork 0
/
canni.py
135 lines (112 loc) · 5.13 KB
/
canni.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import discord
import configparser
import datetime
import requests
import asyncio
import logging
import os
import json
from Handlers.MessageEventHandler import MessageHandler
rootLogger = logging.getLogger()
rootLogger.setLevel(logging.DEBUG)
consoleHandler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)-19s | %(levelname)-8s | %(name)-16s | %(message)-s', "%d-%m-%Y %H:%M:%S")
consoleHandler.setFormatter(formatter)
consoleHandler.setLevel(logging.DEBUG)
rootLogger.addHandler(consoleHandler)
discordLogger = logging.getLogger("discord") # Prevent discord and websockets from spamming the console
discordLogger.setLevel(logging.WARNING)
websocketLogger = logging.getLogger("websockets")
websocketLogger.setLevel(logging.WARNING)
# Abstract away client events into a class
class DiscordBot(discord.Client):
def __init__(self):
super().__init__()
self.logger = logging.getLogger(self.__class__.__name__)
self.logger.info("Initializing bot")
if not os.path.exists("./settings/"):
self.logger.debug("Settings folder was missing, creating it")
os.mkdir("./settings")
self.fConfig = os.path.join("./settings", "config.cfg")
self.fPlaylist = os.path.join("./settings", "playlist.json")
self.galaconDate = datetime.datetime.strptime("07:00:00 1 8 2020", "%H:%M:%S %d %m %Y") # 9:00 - 2:00 (cuz GMT+2)
# Load the config
self.config = Config(self.fConfig)
self.userToken = self.config.token
self.prefix = self.config.prefix
self.youtubeAPI = self.config.youtubeAPI
self.game = discord.Activity(
type = discord.ActivityType.playing,
)
self.messageHandler = MessageHandler(self)
async def on_ready(self):
self.logger.info("Logged in as {name}".format(name=self.user.name))
self.loop.create_task(self.updateTime())
async def on_message(self, message):
if(message.author == self.user or message.author.bot):
return # return silently
try:
if(message.raw_mentions[0] == self.user.id):
pass # Handle mention things here
except IndexError:
pass
await self.messageHandler.MessageReceived(message)
async def updateTime(self):
timedelta = self.galaconDate - datetime.datetime.utcnow()
days = timedelta.days
hours = timedelta.seconds//3600
minutes = (timedelta.seconds//60)%60
if(minutes < 10):
self.logger.info("Time to Galacon: {days} days, {hours}:0{minutes} left! Hype!".format(days=days, hours=hours, minutes=minutes))
self.game.name="Time to Galacon: {days} days, {hours}:0{minutes} left! Hype!".format(days=days, hours=hours, minutes=minutes)
else:
self.logger.info("Time to Galacon: {days} days, {hours}:{minutes} left! Hype!".format(days=days, hours=hours, minutes=minutes))
self.game.name="Time to Galacon: {days} days, {hours}:{minutes} left! Hype!".format(days=days, hours=hours, minutes=minutes)
await self.change_presence(activity=self.game)
await asyncio.sleep(10)
def run(self):
self.logger.info("Logging in")
if not self.userToken:
self.logger.critical("Token isn't defined, aborting")
return
super().run(self.userToken)
class Config:
def __init__(self, file):
super().__init__()
self.file = file
self.logger = logging.getLogger(self.__class__.__name__)
if not os.path.exists(self.file):
self.reset()
config = configparser.ConfigParser()
config.read(self.file, encoding="utf-8")
self.token = config.get("Auth", "token", fallback="")
self.logger.debug("Loading Discord token")
if self.token == "":
self.token = False
if not self.token:
self.logger.critical("Discord bot token is missing in the config, bot won't be able to start!")
self.logger.debug("Loading Youtube API token")
self.youtubeAPI = config.get("Administration", "youtubeAPI", fallback="")
if self.youtubeAPI == "":
self.youtubeAPI = False
if not self.youtubeAPI:
self.logger.warning("Youtube Data API key isn't configured, some functions will be missing")
self.prefix = config.get("Administration", "prefix", fallback=None)
if self.prefix == "":
self.prefix = None
self.logger.debug("Couldn't find prefix, defaulting to mention on login")
else:
self.logger.debug("Prefix set to \"{prefix}\"".format(prefix=self.prefix))
def reset(self):
config = configparser.ConfigParser(allow_no_value=True)
self.logger.warning("Resetting config to default values")
config.add_section("Auth")
config.set("Auth", "token", "")
config.add_section("Administration")
config.set("Administration", "youtubeAPI", "")
config.set("Administration", "prefix", "")
with open(self.file, "w", encoding="utf-8") as file:
config.write(file)
#Start discord Bot
client = DiscordBot()
client.run()