async def silence_on(name, t=1.0, force=False): """ :param name: string :param t: float :param force: bool :rtype: C.Types.Member """ s = C.prm_server user = other.find_member(s, name) if not user: return None if user.top_role >= s.me.top_role and not force: return 'top_role' if other.has_roles(user, C.roles['protege']): return 'protege' t = max(t, 0.02) if user.id in ram.silence_users: check = ram.silence_users[user.id]['check'] else: check = await turn_silence(user, turn=True, force=force) ram.silence_users[user.id] = {'time': other.get_sec_total() + t * 3600 - 1, 'check': tuple(check)} if not C.is_test: add_roles = [other.find(s.roles, id=C.roles['Silence'])] other.add_roles(user, add_roles, 'silence_on') log.I('Silence on for ', user, ' at ', other.t2s(), ' on ', t, 'h.') return user
async def do_check_and_embrace(name, clan_name=None): user = other.find_member(C.vtm_server, name) roles = set(role.id for role in user.roles).difference(C.other_roles) if len(roles) == 1: await just_embrace(user, clan_name=clan_name) # just_embrace_say(user, clan_name) # text = await do_embrace(user, clan_name=clan_name) # com.write_msg(C.main_ch, text) else: log.D('<do_check_and_embrace> Will not embrace, there are other roles.')
def _check_once_in_day(): if not C.is_test: check_t = 7776000 # 90 * 24 * 3600 for uid, usr in people.usrs.items(): t_off = usr.offtime() if t_off > check_t: m = other.find_member(C.vtm_server, uid) if not other.has_roles( m, C.roles_not_for_mortals) and not m.bot and len( m.roles) > 1: other.add_roles(m, C.roles['Mortal'], '_check_once_in_day', by_id=True, server_roles=C.vtm_server.roles) log.I("{} go to Mortal (food)!".format(m)) else: log.I("It's test mode, pass _check_once_in_day")
def comeback(self, memb=None, res=False): global usrs nm = self.name m = memb or other.find_member(C.vtm_server, self.id) if m: nm = other.uname(m) # if self.role != '0': # role = other.find(C.vtm_server.roles, id=self.role) # if role: # other.add_roles(m, role, 'comeback', 5) self.status = 'del' usr = Usr(self.id, name=nm, karma=self.karma, status='add', last_m=other.get_sec_total()) if res: return usr else: usrs[self.id] = usr
async def silence_off(name): """ :param name: string :rtype: C.Types.Member """ s = C.prm_server user = other.find_member(s, name) if not user: ram.silence_users.pop(name, 0) return None s_user = ram.silence_users.pop(user.id, False) if s_user: await turn_silence(user, turn=False, check=s_user['check']) if not C.is_test: rem_roles = [other.find(s.roles, id=C.roles['Silence'])] other.rem_roles(user, rem_roles, 'silence_off') log.I('Silence off for ', user, ' at ', other.t2s()) return user else: return False
async def format_mess(msg, time=False, date=False, dbase=None): """ :type msg: C.Types.Message :type time: Bool :type date: Bool :type dbase: dict :rtype: str """ try: t_m = other.t2s(msg.timestamp) t_n = other.t2s() s_time = ('(from {0})'.format(t_m) if (time or (t_n[:-1] != t_m[:-1]) or (int(t_n[-1]) - int(t_m[-1]) > 1)) else '') if msg.channel.is_private: ch_name = '@#' + str(msg.channel.user) else: every_prm = msg.channel.overwrites_for(msg.server.default_role) if msg.server.id == C.vtm_server.id and every_prm.read_messages is False: ch_name = '##' + str(msg.channel.name) else: ch_name = '#' + str(msg.channel.name) t = ('(from {0})'.format(other.t2s(msg.timestamp, '%d|%m|%y %T')) if date else s_time) cont = msg.content or ( ('≤System≥ ' + msg.system_content) if msg.system_content else '') cont = cont.replace('\n', '\n\t') # type: str db = dbase if dbase is not None else {} # we need a=={} if it is if msg.author.id not in db: db[msg.author.id] = msg.author if msg.raw_mentions: for uid in msg.raw_mentions: if uid in db: usr = db[uid] else: usr = other.find_member(msg.server, uid) or other.find_user(uid) if not usr: usr = await C.client.get_user_info(uid) if usr: db[uid] = usr else: continue usr_name = other.uname(usr) cont = cont.replace('<@' + usr.id + '>', usr_name).replace('<@!' + usr.id + '>', usr_name) if msg.raw_channel_mentions: for chid in msg.raw_channel_mentions: ch = C.client.get_channel(chid) if ch: cont = cont.replace('<#' + ch.id + '>', '#' + str(ch)) if msg.raw_role_mentions and msg.server: for role_id in msg.raw_role_mentions: role = other.find(msg.server.roles, id=role_id) if not role: for s in C.client.servers: if s.id == msg.server.id: continue role = other.find(s.roles, id=role_id) if role: break if role: cont = cont.replace('<@&' + role.id + '>', '&' + str(role)) a_n = other.uname(msg.author) return '{t}<{ch}> {author}: {cont}'.format(t=t, ch=ch_name, author=a_n, cont=cont) except Exception as e: other.pr_error(e, 'log.format_mess', 'format_mess[253] error') return '<format error> ' + (msg.content or ( ('≤System≥ ' + msg.system_content) if msg.system_content else ''))
def find_member(self, i): return other.find_member(self.cmd_server, i)