SpiceBot-migrated/sopel_modules/SpiceBot/Users.py
2019-06-07 13:10:15 -04:00

108 lines
3.1 KiB
Python

# coding=utf8
from __future__ import unicode_literals, absolute_import, division, print_function
"""A way to track users"""
from sopel.tools import Identifier
from .Database import db as botdb
from .Tools import inlist, inlist_match
class BotUsers():
def __init__(self):
self.all = botdb.get_bot_value('users') or []
self.online = []
self.save_user_db()
def whois(self, nick):
nick = Identifier(nick)
nick_id = botdb.db.get_nick_id(nick, create=True)
return nick_id
def save_user_db(self):
botdb.set_bot_value('users', self.all)
def join(self, bot, trigger):
# bot block
if trigger.nick == bot.nick:
return
# Identify
nick_id = self.whois(trigger.nick)
# mark online
self.mark_online(trigger.nick, nick_id)
def quit(self, bot, trigger):
# bot block
if trigger.nick == bot.nick:
return
# Identify
nick_id = self.whois(trigger.nick)
# mark offline
self.mark_offline(trigger.nick, nick_id)
def part(self, bot, trigger):
# bot block
if trigger.nick == bot.nick:
return
# Identify
nick_id = self.whois(trigger.nick)
# mark offline
if trigger.nick not in bot.users:
self.mark_offline(trigger.nick, nick_id)
def kick(self, bot, trigger):
target = str(trigger.args[1])
# bot block
if target == bot.nick:
return
# Identify
nick_id = self.whois(target)
# mark offline
if target not in bot.users:
self.mark_offline(target, nick_id)
def add_to_all(self, nick, nick_id=None):
if not nick_id:
nick_id = self.whois(nick)
# add to all if not there
if nick_id not in self.all.keys():
self.all[nick_id] = {"aliases": []}
# add nick alias
if nick not in self.all[nick_id]:
self.all[nick_id]["aliases"].append(nick)
def mark_online(self, nick, nick_id=None):
if not nick_id:
nick_id = self.whois(nick)
self.add_to_all(nick, nick_id)
if nick_id not in self.online:
self.online.append(nick_id)
def mark_offline(self, nick, nick_id=None):
if not nick_id:
nick_id = self.whois(nick)
self.add_to_all(nick, nick_id)
if nick_id in self.online:
self.online.remove(nick_id)
def current(self, bot, reqchannel='all'):
user_list = []
if reqchannel == 'all':
for channel in bot.channels.keys():
for user in bot.channels[channel].privileges.keys():
user_id = self.whois(user)
user_list.append(user_id)
return user_list
elif not inlist(reqchannel, bot.channels.keys()):
return user_list
else:
channel = inlist_match(reqchannel, bot.channels.keys())
for user in bot.channels[channel].privileges.keys():
user_id = self.whois(user)
user_list.append(user_id)
return user_list
users = BotUsers()