Merge pull request #129 from classabbyamp/dynamic-status

modify playing status so it changes based on time of day
This commit is contained in:
Abigail Gold 2019-12-23 16:01:09 -05:00 committed by GitHub
commit 0bc368877b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 57 additions and 10 deletions

49
main.py
View File

@ -8,12 +8,16 @@ This file is part of discord-qrm2 and is released under the terms of the GNU
General Public License, version 2.
"""
from datetime import time, datetime
import random
import pytz
import discord
from discord.ext import commands, tasks
import common as cmn
import info
import data.options as opt
import data.keys as keys
@ -113,6 +117,12 @@ async def _extctl_unload(ctx: commands.Context, extension: str):
async def on_ready():
print(f"Logged in as: {bot.user} - {bot.user.id}")
print("------")
if opt.status_mode == "time":
_ensure_activity_time.start()
elif opt.status_mode == "random":
_ensure_activity_random.start()
else:
_ensure_activity_fixed.start()
@bot.event
@ -128,13 +138,38 @@ async def on_message(message):
# --- Tasks ---
@tasks.loop(minutes=5)
async def _ensure_activity():
await bot.change_presence(activity=discord.Game(name=opt.game))
async def _ensure_activity_time():
status = opt.statuses[0]
try:
tz = pytz.timezone(opt.status_tz)
except pytz.exceptions.UnknownTimeZoneError:
await bot.change_presence(activity=discord.Game(name="with invalid timezones."))
return
now = datetime.now(tz=tz).time()
for sts in opt.time_statuses:
start_time = time(hour=sts[1][0], minute=sts[1][1], tzinfo=tz)
end_time = time(hour=sts[2][0], minute=sts[2][1], tzinfo=tz)
if start_time < now <= end_time:
status = sts[0]
await bot.change_presence(activity=discord.Game(name=status))
@_ensure_activity.before_loop
async def _before_ensure_activity():
await bot.wait_until_ready()
@tasks.loop(minutes=5)
async def _ensure_activity_random():
status = random.choice(opt.statuses)
await bot.change_presence(activity=discord.Game(name=status))
@tasks.loop(minutes=5)
async def _ensure_activity_fixed():
status = opt.statuses[0]
await bot.change_presence(activity=discord.Game(name=status))
# --- Run ---
@ -142,8 +177,6 @@ async def _before_ensure_activity():
for ext in opt.exts:
bot.load_extension(ext_dir + '.' + ext)
_ensure_activity.start()
try:
bot.run(keys.discord_token)

View File

@ -2,3 +2,4 @@ discord.py
ctyparser
beautifulsoup4
lxml
pytz

View File

@ -29,8 +29,21 @@ owners_uids = (200102491231092736,)
# The extensions to load when running the bot.
exts = ['ae7q', 'base', 'fun', 'grid', 'ham', 'image', 'lookup', 'morse', 'qrz', 'study', 'weather']
# The text to put in the "playing" status.
game = 'with lids on 7.200'
# Either "time", "random", or "fixed" (first item in statuses)
status_mode = "fixed"
# Random statuses pool
statuses = ["with lids on the air", "with fire"]
# Timezone for the status (string)
# See https://pythonhosted.org/pytz/ for more info
status_tz = 'US/Eastern'
# The text to put in the "playing" status, with start and stop times
time_statuses = [('with lids on 3.840', (00, 00), (6, 00)),
('with lids on 7.200', (6, 00), (10, 00)),
('with lids on 14.313', (10, 00), (18, 00)),
('with lids on 7.200', (18, 00), (20, 00)),
('with lids on 3.840', (20, 00), (23, 59))]
# Emoji IDs and keywords for emoji reactions
# Use the format {emoji_id (int): ('tuple', 'of', 'lowercase', 'keywords')}