More thread safety.
authorCMDR furrycat <elite@furrycat.net>
Mon, 3 Oct 2016 06:46:17 +0000 (07:46 +0100)
committerCMDR furrycat <elite@furrycat.net>
Mon, 3 Oct 2016 06:46:17 +0000 (07:46 +0100)
bot.py

diff --git a/bot.py b/bot.py
index d66683d..b148a49 100755 (executable)
--- a/bot.py
+++ b/bot.py
@@ -80,9 +80,11 @@ bots = {
   }
 }
 
-feeds = []
-greetings = []
-orders = []
+def get_bot_variable(k, v = None):
+  bot = bots.get(str(client.user.id), [])
+  if k in bot:
+    return bot.get(k, v)
+  return v
 
 def open_url(url):
   if sys.version_info >= (3, 0):
@@ -460,7 +462,7 @@ def set_unassigned(member):
 
 @asyncio.coroutine
 def greet(channel, member, sound = True):
-  for greeting in greetings:
+  for greeting in get_bot_variable(greetings, []):
     if greeting['channel'] != int(channel.id):
       continue
     message = ' '.join([member.mention, greeting['message']])
@@ -555,9 +557,9 @@ def do_rss(feed):
       pass
 
 @asyncio.coroutine
-def do_feeds(feeds):
+def do_feeds():
   while True:
-    for feed in feeds:
+    for feed in get_bot_variable('feeds', []):
       yield from set_rss_permissions(feed)
       yield from do_rss(feed)
     yield from asyncio.sleep(rsstime.value)
@@ -593,12 +595,12 @@ def give_order(order, digest = None):
     pass
 
 @asyncio.coroutine
-def do_orders(orders):
+def do_orders():
   while True:
     waittime = None
     given = {}
     now = time.time()
-    for order in orders:
+    for order in get_bot_variable('orders', []):
       if waittime is None or waittime > order['seconds']:
         waittime = order['seconds']
       digest = hashlib.sha224(order['message'].encode('utf-8')).hexdigest()
@@ -661,8 +663,10 @@ def process_module(message, command, raw):
   else:
     yield from maybe_say(message.channel, 'meow!')
 
-@asyncio.coroutine
 def channels_to_greet():
+  greetings = get_bot_variable('greetings', [])
+  if not len(greetings):
+    return []
   channels = []
   for channel in client.get_all_channels():
     if channel.is_private:
@@ -752,14 +756,11 @@ def play_greeting(greeting):
 @asyncio.coroutine
 def on_ready():
   log.info('Logged in as {}#{}'.format(client.user.name, client.user.id))
-  bot = bots.get(str(client.user.id), [])
-  if bot is not None:
-    feeds = bot.get('feeds', [])
-    greetings = bot.get('greetings', [])
-    orders = bot.get('orders', [])
+  feeds = get_bot_variable('feeds', [])
+  orders = get_bot_variable('orders', [])
   log.info('Admins are: {}'.format(admins))
   yield from wake_up(True)
-  channels = yield from channels_to_greet()
+  channels = channels_to_greet()
   log.info('Greeting in {}'.format([channel.name for channel in channels]))
   for channel in channels:
     log.debug('Greeting in {}'.format(channel.name))
@@ -774,9 +775,9 @@ def on_ready():
     log.debug('Maybe unassigning {}'.format(member.name))
     yield from set_unassigned(member)
   log.info('RSS feeds: {}'.format([feed['description'] for feed in feeds if 'description' in feed]))
-  asyncio.async(do_feeds(feeds))
+  asyncio.async(do_feeds())
   log.info('Orders in {}'.format([channel.name for channel in filter(None, [client.get_channel(str(order['channel'])) for order in orders])]))
-  asyncio.async(do_orders(orders))
+  asyncio.async(do_orders())
   asyncio.async(maybe_sleep())
 
 def mentioned_in(message, explicit = True):
@@ -810,7 +811,7 @@ def on_message(message):
 @client.event
 @asyncio.coroutine
 def on_member_join(member):
-  channels = yield from channels_to_greet()
+  channels = channels_to_greet()
   for channel in channels:
     result = should_greet_member_in(channel, member)
     if result: