From 60bdd83ab5ee59e23af79766f22833dfa79f5a7b Mon Sep 17 00:00:00 2001 From: CMDR furrycat Date: Mon, 26 Sep 2016 11:29:12 +0100 Subject: [PATCH] Greet new arrivals before setting the Unassigned role. --- bot.py | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/bot.py b/bot.py index 4b43835..f51b6cb 100755 --- a/bot.py +++ b/bot.py @@ -43,6 +43,10 @@ feeds = [ { 'channel': 227710451226509312, 'url': 'https://miggy.org/games/elite-dangerous/devtracker/ed-dev-posts.rss', 'summary': True } ] +greetings = [ + { 'channel': 225217541922881538, 'message': 'Welcome to Delta Squadron, take a look at #delta_rules and make yourself at home in the public lobby. If interested in joining please PM a member of the High Command or Council for assistance' } +] + def open_url(url): if sys.version_info >= (3, 0): # Specify our own user agent as Cloudflare doesn't seem to like the urllib one @@ -100,13 +104,14 @@ def is_admin(server, member): for role in server.roles: if role.name != admin_role: continue - if role.id in member.roles: + if role in member.roles: return True return False @asyncio.coroutine def do_admin(message, command, raw): - if not is_admin(message.server, message.author): + result = yield from is_admin(message.server, message.author) + if not result: yield from not_admin(message) return @@ -193,9 +198,6 @@ def do_fork(message, command, raw): @asyncio.coroutine def set_role(member, role_name = 'Unassigned', minimum = 1): - if is_admin(None, member): - return - role = None for server_role in member.server.roles: if server_role.name != role_name: @@ -220,9 +222,24 @@ def set_role(member, role_name = 'Unassigned', minimum = 1): @asyncio.coroutine def set_unassigned(member): + result = yield from is_admin(None, member) + if result: + log.debug('{} is an admin so not setting role {}'.format(member.name, 'Unassigned')) + return yield from set_role(member, 'Unassigned') @asyncio.coroutine +def greet(channel, member): + for greeting in greetings: + if greeting['channel'] != int(channel.id): + continue + message = ' '.join([member.mention, greeting['message']]) + if dryrun: + log.info('Not sending greeting {}'.format(message)) + else: + yield from client.send_message(channel, message) + +@asyncio.coroutine def set_rss_permissions(feed): channel = client.get_channel(str(feed['channel'])) if channel is None: @@ -337,12 +354,45 @@ def process_module(message, command, raw): log.debug('Unrecognised command!') yield from maybe_say(message.channel, 'meow!') +@asyncio.coroutine +def channels_to_greet(): + channels = [] + for channel in client.get_all_channels(): + if channel.is_private: + continue + if int(channel.id) not in [greeting['channel'] for greeting in greetings]: + continue + channels.append(channel) + return channels + +def should_greet_member_in(channel, member, role_name = 'Unassigned', minimum = 1): + permissions = channel.permissions_for(member) + if permissions is None: + return False + if not permissions.read_messages: + return False + if role_name in [role.name for role in member.roles]: + return False + if len(member.roles) > minimum: + return False + return True + @client.event @asyncio.coroutine def on_ready(): print('Logged in as {}#{}'.format(client.user.name, client.user.id)) print('Admins are: {}'.format(admins)) + channels = yield from channels_to_greet() + print('Greeting in {}'.format([channel.name for channel in channels])) + for channel in channels: + log.debug('Greeting in {}'.format(channel.name)) + for member in channel.server.members: + result = should_greet_member_in(channel, member) + if not result: + continue + yield from greet(channel, member) for member in client.get_all_members(): + log.debug('Maybe unassigning {}'.format(member.name)) yield from set_unassigned(member) yield from do_feeds(feeds) @@ -365,6 +415,11 @@ def on_message(message): @client.event @asyncio.coroutine def on_member_join(member): + channels = yield from channels_to_greet() + for channel in channels: + result = should_greet_member_in(channel, member) + if result: + yield from greet(channel, member) yield from set_unassigned(member) client.run(token) -- 2.7.4