Code cleanup

This commit is contained in:
gpkvt 2022-08-28 11:43:12 +02:00
parent 4d8e07f393
commit c759c78f7f
1 changed files with 239 additions and 165 deletions

404
tts.py
View File

@ -51,17 +51,25 @@ class IRC:
def __init__(self): def __init__(self):
self.irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.tts_denied = [] self.tts = {
self.tts_allowed = [] "status": CONF['TTS_STARTENABLED'],
self.tts_status = CONF['TTS_STARTENABLED'] "whitelist": [],
self.quickvote_status = False "blacklist": []
self.pick_status = False }
self.votemsg = False self.quickvote = {
self.poll = {} "status": False,
self.pollcount = 0 "message": False
self.pickme = [] }
self.picknumber = 1 self.poll = {
self.pickcount = 0 "count": 0,
"data": {}
}
self.pick = {
"status": False,
"number": 1,
"count": 0,
"pickme": []
}
if 'WHITELIST_USER' in CONF: if 'WHITELIST_USER' in CONF:
self.tts_allowed = CONF['WHITELIST_USER'] self.tts_allowed = CONF['WHITELIST_USER']
@ -77,6 +85,7 @@ class IRC:
""" """
logging.info("Connecting to: %s", server) logging.info("Connecting to: %s", server)
logging.info('Waiting...') logging.info('Waiting...')
try: try:
self.irc.connect((server, port)) self.irc.connect((server, port))
except ConnectionResetError: except ConnectionResetError:
@ -166,51 +175,8 @@ class IRC:
tags = self.get_tags(resp) tags = self.get_tags(resp)
message = self.get_message(resp) message = self.get_message(resp)
user = tags['user']
msg = message['message']
msglen = message['length']
logging.debug('Msg: %s', msg)
logging.debug('Msg length: %s', msglen)
logging.debug('Deny List:')
logging.debug(self.tts_denied)
self.priviledged_commands(message, tags) self.priviledged_commands(message, tags)
self.unpriviledged_commands(message, tags)
if msg.startswith('#pickme') and self.pick_status is True:
logging.info('Pickme detected')
self.pickcount = self.pickcount + 1
self.pickme.append(user)
logging.debug("pickme %s added", user)
return
if msg.startswith('#') and self.quickvote_status is True:
logging.info('Quickvote: Cast detected')
self.pollcount += 1
self.poll[user] = msg.lower()
logging.debug("poll: %s", self.poll)
return
if msg.startswith('!tts'):
logging.info('!tts command detected')
self.Commands.tts(self, message, tags)
return
if msg.startswith('!wiki') and CONF['FEATURE']['WIKI']:
logging.debug("!wiki command detected")
self.Commands.wiki(self, tags, msg)
return
if CONF['FEATURE']['QUOTE']:
if msg.startswith('!addquote'):
logging.debug("!addquote command detected")
self.Commands.addquote(self, tags, msg)
return
if msg.startswith('!smartquote') or msg.startswith('!sq'):
logging.debug("!smartquote command detected")
self.Commands.quote(self, tags, msg)
return
def get_tags(self, resp): def get_tags(self, resp):
""" Strip tags from response """ Strip tags from response
@ -256,6 +222,51 @@ class IRC:
return msg return msg
def unpriviledged_commands(self, message, tags):
""" Process unpriviledged commands
:param dict message: Message
:param dict tags: Message metadata (tags)
"""
msg = message['message']
user = tags['user']
if msg.startswith('#pickme') and self.pick['status'] is True:
logging.info('Pickme detected')
self.pick['count'] = self.pick['count'] + 1
self.pick['pickme'].append(user)
logging.debug("pickme %s added", user)
return
if msg.startswith('#') and self.quickvote['status'] is True:
logging.info('Quickvote: Cast detected')
self.poll['count'] += 1
self.poll['data'][user] = msg.lower()
logging.debug("poll: %s", self.poll)
return
if msg.startswith('!tts'):
logging.info('!tts command detected')
self.Commands.tts(self, message, tags)
return
if msg.startswith('!wiki') and CONF['FEATURE']['WIKI']:
logging.debug("!wiki command detected")
self.Commands.wiki(self, tags, msg)
return
if CONF['FEATURE']['QUOTE']:
if msg.startswith('!addquote'):
logging.debug("!addquote command detected")
self.Commands.addquote(self, tags, msg)
return
if msg.startswith('!smartquote') or msg.startswith('!sq'):
logging.debug("!smartquote command detected")
self.Commands.quote(self, tags, msg)
return
def priviledged_commands(self, message, tags): def priviledged_commands(self, message, tags):
""" Process priviledged commands """ Process priviledged commands
@ -270,11 +281,41 @@ class IRC:
if 'broadcaster' in badges or 'moderator' in badges: if 'broadcaster' in badges or 'moderator' in badges:
if msg.startswith('!ping') and CONF['FEATURE']['PING']: if msg.startswith('!ping') and CONF['FEATURE']['PING']:
logging.debug("Ping check received.") logging.debug("Ping check received.")
self.sendmsg(CONF['IRC_CHANNEL'], "@"+str(user), "Pong!") self.sendmsg(
CONF['IRC_CHANNEL'],
"@"+str(user),
"Pong!"
)
elif msg.startswith('!version') and CONF['FEATURE']['VERSION']: elif msg.startswith('!version') and CONF['FEATURE']['VERSION']:
logging.debug("!version command detected") logging.debug("!version command detected")
self.sendmsg(CONF['IRC_CHANNEL'], "@"+str(user), VERSION) self.sendmsg(
CONF['IRC_CHANNEL'],
"@"+str(user),
VERSION
)
elif msg.startswith('!toff'):
logging.info('TTS is now turned off')
msg_queue.clear()
MSG_QUEUE_RAW.clear()
self.tts['status'] = False
self.sendmsg(
CONF['IRC_CHANNEL'],
"@"+str(user),
CONF['MESSAGE']['TOFF']
)
elif msg.startswith('!ton'):
logging.info('TTS is now turned on')
msg_queue.clear()
MSG_QUEUE_RAW.clear()
self.tts['status'] = True
self.sendmsg(
CONF['IRC_CHANNEL'],
"@"+str(user),
CONF['MESSAGE']['TON']
)
elif msg.startswith('!pick') and CONF['FEATURE']['PICK']: elif msg.startswith('!pick') and CONF['FEATURE']['PICK']:
logging.debug("!pick command detected") logging.debug("!pick command detected")
@ -304,20 +345,6 @@ class IRC:
logging.info('!delay command detected') logging.info('!delay command detected')
self.Commands.delay(self, msg) self.Commands.delay(self, msg)
elif msg.startswith('!toff'):
logging.info('TTS is now turned off')
msg_queue.clear()
MSG_QUEUE_RAW.clear()
self.tts_status = False
self.sendmsg(CONF['IRC_CHANNEL'], "@"+str(user), CONF['MESSAGE']['TOFF'])
elif msg.startswith('!ton'):
logging.info('TTS is now turned on')
msg_queue.clear()
MSG_QUEUE_RAW.clear()
self.tts_status = True
self.sendmsg(CONF['IRC_CHANNEL'], "@"+str(user), CONF['MESSAGE']['TON'])
def check_subonly(self, tags): def check_subonly(self, tags):
""" Check if subonly mode is enabled and sender is sub """ Check if subonly mode is enabled and sender is sub
@ -338,7 +365,11 @@ class IRC:
return False return False
logging.debug('TTS is sub-only') logging.debug('TTS is sub-only')
self.sendmsg(CONF['IRC_CHANNEL'], "@"+str(user), CONF['MESSAGE']['SUBONLY']) self.sendmsg(
CONF['IRC_CHANNEL'],
"@"+str(user),
CONF['MESSAGE']['SUBONLY']
)
return True return True
def check_modonly(self, tags): def check_modonly(self, tags):
@ -360,7 +391,11 @@ class IRC:
return False return False
logging.debug('TTS is mod-only') logging.debug('TTS is mod-only')
self.sendmsg(CONF['IRC_CHANNEL'], "@"+str(user), CONF['MESSAGE']['MODONLY']) self.sendmsg(
CONF['IRC_CHANNEL'],
"@"+str(user),
CONF['MESSAGE']['MODONLY']
)
return True return True
def check_tts_disabled(self, user): def check_tts_disabled(self, user):
@ -370,8 +405,12 @@ class IRC:
:return bool: :return bool:
""" """
if not self.tts_status: if not self.tts['status']:
self.sendmsg(CONF['IRC_CHANNEL'], "@"+str(user), CONF['MESSAGE']['DISABLED']) self.sendmsg(
CONF['IRC_CHANNEL'],
"@"+str(user),
CONF['MESSAGE']['DISABLED']
)
return True return True
logging.debug('TTS is enabled') logging.debug('TTS is enabled')
@ -387,7 +426,11 @@ class IRC:
""" """
if message['length'] > CONF['IRC_TTS_LEN']: if message['length'] > CONF['IRC_TTS_LEN']:
self.sendmsg(CONF['IRC_CHANNEL'], "@"+str(user), CONF['MESSAGE']['TOO_LONG']) self.sendmsg(
CONF['IRC_CHANNEL'],
"@"+str(user),
CONF['MESSAGE']['TOO_LONG']
)
return True return True
logging.debug('Check length: Message is ok') logging.debug('Check length: Message is ok')
@ -403,9 +446,13 @@ class IRC:
:return bool: :return bool:
""" """
if user in self.tts_denied: if user in self.tts['denied']:
logging.info("%s is not allowed to use TTS", user) logging.info("%s is not allowed to use TTS", user)
self.sendmsg(CONF['IRC_CHANNEL'], "@"+str(user), CONF['MESSAGE']['DENIED']) self.sendmsg(
CONF['IRC_CHANNEL'],
"@"+str(user),
CONF['MESSAGE']['DENIED']
)
return True return True
logging.debug("%s is allowed to use TTS", user) logging.debug("%s is allowed to use TTS", user)
@ -426,7 +473,8 @@ class IRC:
logging.debug("tts_allowed: %s", self.tts_allowed) logging.debug("tts_allowed: %s", self.tts_allowed)
self.sendmsg( self.sendmsg(
CONF['IRC_CHANNEL'], CONF['IRC_CHANNEL'],
"@"+str(user), CONF['MESSAGE']['WHITELISTONLY'] "@"+str(user),
CONF['MESSAGE']['WHITELISTONLY']
) )
return False return False
return True return True
@ -584,8 +632,8 @@ class IRC:
} }
req = requests.get(url=api_endpoint, headers=headers) req = requests.get(url=api_endpoint, headers=headers)
data = req.json() data = req.json()
game = data['data'][0]['game_name']
game = data['data'][0]['game_name']
quote = f"#{nol}: \"{quote[1]}\" -{username}/{game} ({date})\n" quote = f"#{nol}: \"{quote[1]}\" -{username}/{game} ({date})\n"
except Exception: except Exception:
logging.warning('Could not get metadata for quote') logging.warning('Could not get metadata for quote')
@ -595,12 +643,11 @@ class IRC:
with open("quotes.txt", "ab") as file: with open("quotes.txt", "ab") as file:
file.write(quote.encode('utf-8')) file.write(quote.encode('utf-8'))
msg = f"{CONF['MESSAGE']['QUOTE_ADDED_PREFIX']} \ message = f"{CONF['MESSAGE']['QUOTE_ADDED_PREFIX']} \
#{nol} {CONF['MESSAGE']['QUOTE_ADDED_SUFFIX']}" #{nol} {CONF['MESSAGE']['QUOTE_ADDED_SUFFIX']}"
raw_msg = { raw_msg = {
"TTS": True, "TTS": True,
"msg": msg, "msg": message,
"badges": True, "badges": True,
"subscriber": True, "subscriber": True,
"msgid": True, "msgid": True,
@ -610,7 +657,7 @@ class IRC:
"timestamp": str(time.time_ns()) "timestamp": str(time.time_ns())
} }
msg_queue[raw_msg['timestamp']] = [raw_msg['user'], raw_msg['msg']] msg_queue[raw_msg['timestamp']] = [raw_msg['user'], raw_msg['msg']]
IRC.sendmsg(self, CONF['IRC_CHANNEL'], "@"+str(user), msg) IRC.sendmsg(self, CONF['IRC_CHANNEL'], "@"+str(user), message)
def wiki(self, tags, msg): def wiki(self, tags, msg):
""" !wiki command """ !wiki command
@ -630,11 +677,10 @@ class IRC:
IRC.sendmsg(self, CONF['IRC_CHANNEL'], "@"+str(user), wikiresult) IRC.sendmsg(self, CONF['IRC_CHANNEL'], "@"+str(user), wikiresult)
IRC.sendmsg(self, CONF['IRC_CHANNEL'], "@"+str(user), wikipedia.page(msg).url) IRC.sendmsg(self, CONF['IRC_CHANNEL'], "@"+str(user), wikipedia.page(msg).url)
wikiresult = wikiresult.replace('==', '') message = wikiresult.replace('==', '')
raw_msg = { raw_msg = {
"TTS": True, "TTS": True,
"msg": wikiresult, "msg": message,
"badges": True, "badges": True,
"subscriber": True, "subscriber": True,
"msgid": True, "msgid": True,
@ -734,11 +780,10 @@ class IRC:
logging.debug("Quote: %s", quote) logging.debug("Quote: %s", quote)
IRC.sendmsg(self, CONF['IRC_CHANNEL'], "", quote) IRC.sendmsg(self, CONF['IRC_CHANNEL'], "", quote)
quote = quote.rsplit('(', 1)[0] message = quote.rsplit('(', 1)[0]
raw_msg = { raw_msg = {
"TTS": True, "TTS": True,
"msg": quote, "msg": message,
"badges": True, "badges": True,
"subscriber": True, "subscriber": True,
"msgid": True, "msgid": True,
@ -830,10 +875,11 @@ class IRC:
logging.error("There was an error during picking.") logging.error("There was an error during picking.")
joined_picks = False joined_picks = False
message = f"{CONF['MESSAGE']['PICKRESULT']} {joined_picks}"
if joined_picks: if joined_picks:
raw_msg = { raw_msg = {
"TTS": True, "TTS": True,
"msg": CONF['MESSAGE']['PICKRESULT'] +" "+ str(joined_picks), "msg": message,
"badges": True, "badges": True,
"subscriber": True, "subscriber": True,
"msgid": True, "msgid": True,
@ -924,9 +970,11 @@ class IRC:
logging.debug(count) logging.debug(count)
count = str(count[0][0].replace('#',''))
message = f"{CONF['MESSAGE']['VOTERESULT']} {count}"
raw_msg = { raw_msg = {
"TTS": True, "TTS": True,
"msg": CONF['MESSAGE']['VOTERESULT'] +" "+ str(count[0][0].replace('#','')), "msg": message ,
"badges": True, "badges": True,
"subscriber": True, "subscriber": True,
"msgid": True, "msgid": True,
@ -941,10 +989,11 @@ class IRC:
logging.debug('Votemsg: %s', msg) logging.debug('Votemsg: %s', msg)
for key, value in count: for key, value in count:
message = f"{key} ({value}) {CONF['MESSAGE']['VOTES']})"
IRC.sendmsg( IRC.sendmsg(
self, self,
CONF['IRC_CHANNEL'], "*", CONF['IRC_CHANNEL'], "*",
str(key)+" ("+str(value)+ " "+ CONF['MESSAGE']['VOTES'] + ")" message
) )
self.quickvote_status = False self.quickvote_status = False
@ -979,7 +1028,7 @@ class IRC:
randomfile = msg.replace('!random', '').strip().lower() randomfile = msg.replace('!random', '').strip().lower()
if randomfile: if randomfile:
randomfile = "random_"+str(os.path.basename(randomfile))+".txt" randomfile = f"random_{os.path.basename(randomfile)}.txt"
else: else:
randomfile = "random.txt" randomfile = "random.txt"
@ -1223,6 +1272,68 @@ def http_serve_forever(httpd):
""" httpd loop """ """ httpd loop """
httpd.serve_forever() httpd.serve_forever()
def send_tts_queue():
""" Send messages to TTS """
for raw_msg in MSG_QUEUE_RAW:
logging.debug('Raw msg: %s', MSG_QUEUE_RAW)
now = datetime.datetime.now()
if now - raw_msg['queuetime'] > datetime.timedelta(seconds=CONF['IRC_CLEARMSG_TIMEOUT']):
logging.debug('clearmsg_timeout reached')
if raw_msg['timestamp'] not in msg_queue:
logging.info('Sending TTS message')
msg_queue[raw_msg['timestamp']] = [raw_msg['user'], raw_msg['msg']]
logging.debug("msg_queue: %s", msg_queue)
else:
logging.debug('Msg is already in queue')
def get_url(path=False):
""" Generate a valid URL from config values """
if CONF['HTTP_BIND'] == "0.0.0.0":
url = "localhost"
else:
url = CONF['HTTP_BIND']
url = f"http://{url}:{CONF['HTTP_PORT']}/"
if path:
url = f"{url}{path}"
return url
def check_oauth_token():
""" Check for valid authentication via Twitch API """
global CONF
logging.debug('Checking OAuth Token')
try:
url = 'https://id.twitch.tv/oauth2/validate'
oauth = CONF['IRC_OAUTH_TOKEN'].replace('oauth:','')
oauth = f"OAuth {oauth}"
request = urllib.request.Request(url)
request.add_header('Authorization', oauth)
urllib.request.urlopen(request)
except HTTPError:
logging.fatal('Twitch rejected your OAuth Token. Please check and generate a new one.')
logging.info('Please open http://%s:%s/token to generate your OAuth-Token.',
CONF['HTTP_BIND'],
CONF['HTTP_PORT']
)
url = get_url("token")
webbrowser.open_new_tab(url)
logging.info('Please complete the OAuth process and add the token into your "config.yml" \
within the next 5 minutes.')
time.sleep(300)
CONF = load_config()
check_oauth_token()
logging.info('OAuth Token is valid')
return CONF
def load_config(): def load_config():
""" Loading config variables """ """ Loading config variables """
@ -1358,13 +1469,27 @@ def load_config():
) )
CONF['FEATURE'] = {} CONF['FEATURE'] = {}
CONF['FEATURE']['WIKI'] = cfg.get('features', {}).get('wiki', True) CONF['FEATURE']['WIKI'] = cfg.get('features', {}).get(
CONF['FEATURE']['PICK'] = cfg.get('features', {}).get('pick', True) 'wiki', True
CONF['FEATURE']['VOTE'] = cfg.get('features', {}).get('vote', True) )
CONF['FEATURE']['QUOTE'] = cfg.get('features', {}).get('quote', True) CONF['FEATURE']['PICK'] = cfg.get('features', {}).get(
CONF['FEATURE']['RANDOM'] = cfg.get('features', {}).get('random', True) 'pick', True
CONF['FEATURE']['VERSION'] = cfg.get('features', {}).get('version', True) )
CONF['FEATURE']['PING'] = cfg.get('features', {}).get('ping', True) CONF['FEATURE']['VOTE'] = cfg.get('features', {}).get(
'vote', True
)
CONF['FEATURE']['QUOTE'] = cfg.get('features', {}).get(
'quote', True
)
CONF['FEATURE']['RANDOM'] = cfg.get('features', {}).get(
'random', True
)
CONF['FEATURE']['VERSION'] = cfg.get('features', {}).get(
'version', True
)
CONF['FEATURE']['PING'] = cfg.get('features', {}).get(
'ping', True
)
CONF['USERMAP'] = cfg.get('usermapping', []) CONF['USERMAP'] = cfg.get('usermapping', [])
@ -1394,65 +1519,6 @@ def load_config():
return CONF return CONF
def send_tts_queue():
""" Send messages to TTS """
for raw_msg in MSG_QUEUE_RAW:
logging.debug('Raw msg: %s', MSG_QUEUE_RAW)
now = datetime.datetime.now()
if now - raw_msg['queuetime'] > datetime.timedelta(seconds=CONF['IRC_CLEARMSG_TIMEOUT']):
logging.debug('clearmsg_timeout reached')
if raw_msg['timestamp'] not in msg_queue:
logging.info('Sending TTS message')
msg_queue[raw_msg['timestamp']] = [raw_msg['user'], raw_msg['msg']]
logging.debug("msg_queue: %s", msg_queue)
else:
logging.debug('Msg is already in queue')
def get_url(path=False):
""" Generate a valid URL from config values """
if CONF['HTTP_BIND'] == "0.0.0.0":
url = "localhost"
else:
url = CONF['HTTP_BIND']
url = "http://"+str(url)+":"+str(CONF['HTTP_PORT'])+"/"
if path:
url = url+str(path)
return url
def check_oauth_token():
""" Check for valid authentication via Twitch API """
global CONF
logging.debug('Checking OAuth Token')
try:
url = 'https://id.twitch.tv/oauth2/validate'
oauth = "OAuth "+str(CONF['IRC_OAUTH_TOKEN'].replace('oauth:',''))
request = urllib.request.Request(url)
request.add_header('Authorization', oauth)
urllib.request.urlopen(request)
except HTTPError:
logging.fatal('Twitch rejected your OAuth Token. Please check and generate a new one.')
logging.info('Please open http://%s:%s/token to generate your OAuth-Token.',
CONF['HTTP_BIND'], CONF['HTTP_PORT'])
url = get_url("token")
webbrowser.open_new_tab(url)
logging.info('Please complete the OAuth process and add the token into your "config.yml" \
within the next 5 minutes.')
time.sleep(300)
CONF = load_config()
check_oauth_token()
logging.info('OAuth Token is valid')
return CONF
def main(): def main():
""" Main loop """ """ Main loop """
@ -1465,7 +1531,11 @@ def main():
sys.tracebacklimit = 5 sys.tracebacklimit = 5
logging.info("Starting Webserver") logging.info("Starting Webserver")
httpd = ThreadingSimpleServer((CONF['HTTP_BIND'], CONF['HTTP_PORT']), HTTPserv) httpd = ThreadingSimpleServer(
(CONF['HTTP_BIND'],
CONF['HTTP_PORT']),
HTTPserv
)
http_thread = Thread(target=http_serve_forever, daemon=True, args=(httpd, )) http_thread = Thread(target=http_serve_forever, daemon=True, args=(httpd, ))
http_thread.start() http_thread.start()
@ -1481,7 +1551,11 @@ def main():
CONF['IRC_USERNAME'], CONF['IRC_USERNAME'],
CONF['IRC_OAUTH_TOKEN'] CONF['IRC_OAUTH_TOKEN']
) )
irc.sendmsg(CONF['IRC_CHANNEL'], 'MrDestructoid', CONF['MESSAGE']['READY']) irc.sendmsg(
CONF['IRC_CHANNEL'],
'MrDestructoid',
CONF['MESSAGE']['READY']
)
logging.info('Connected and joined') logging.info('Connected and joined')
url = get_url() url = get_url()
@ -1500,15 +1574,15 @@ def main():
CONF = load_config() CONF = load_config()
lastreload = datetime.datetime.now() lastreload = datetime.datetime.now()
if irc.quickvote_status and irc.votemsg: if irc.quickvote['status'] and irc.quickvote['message']:
logging.info('Quickvote is active') logging.info('Quickvote is active')
irc.sendmsg( irc.sendmsg(
CONF['IRC_CHANNEL'], CONF['IRC_CHANNEL'],
"@chat", "@chat",
CONF['MESSAGE']['VOTESTART'] + " (" + str(irc.votemsg) + ")" f"{CONF['MESSAGE']['VOTESTART']} ({irc.quickvote['message']})"
) )
if not irc.tts_status: if not irc.tts['status']:
continue continue
logging.debug('MSG_QUEUE_RAW: %s', MSG_QUEUE_RAW) logging.debug('MSG_QUEUE_RAW: %s', MSG_QUEUE_RAW)