from slixmpp.exceptions import XMPPError
from slixmpp.xmlstream import tostring
-from .plugin import Plugin
+from .plugin import Plugin, botcmd
def jid_to_sha256(jid: JID) -> str:
self.participants = set()
self.moderator = False
self.blocklist: BL = None
+ self.hits = 0
+ self.presences = {}
def _exit(self):
self.rm_handlers()
"""Ban jid in RTBL"""
if not self.moderator:
return
- if not self.blocklist:
- self.log.debug("block list not populated yet")
+ if self.blocklist is None:
+ self.log.info('Not checking %s, block list not populated yet', jid)
return
if self.blocklist.check(jid):
self.log.debug(f'About to ban {jid}')
if reason is not None:
reason = f'rtbl {reason}'
await self.ban(jid.bare, reason=reason)
+ self.hits += 1
+ self.log.info(f'{jid} banned!')
def got_offline(self, pres):
"""Handler method for leaving MUC participants"""
user = fjid if fjid.full else pres['muc']['nick']
try:
self.participants.remove(user)
+ self.presences.pop(pres['muc']['nick'])
except KeyError:
self.log.error('KeyError removing participant: "%s"', user)
- self.log.debug(f'participants: -{user} (len:{len(self.participants)})')
+ self.log.debug(f'participants: - {user} got offline (len:{len(self.participants)})')
def got_presence(self, pres):
"""Does bot have required permissions"""
else:
self.log.info('Got moderator permissions.')
self.moderator = True
+ nick = pres['muc']['nick']
+ fjid = pres['muc']['jid']
+ role = pres['muc']['role']
+ affi = pres['muc']['affiliation']
+ user = fjid if fjid.full else nick
+ self.log.debug(f'participants: u {user}:{role}/{affi} (len:{len(self.participants)})')
+ self.presences.update({nick: pres})
async def got_online(self, pres):
"""Handler method for new MUC participants"""
fjid = pres['muc']['jid']
- user = fjid if fjid.full else pres['muc']['nick']
+ nick = pres['muc']['nick']
+ role = pres['muc']['role']
+ affi = pres['muc']['affiliation']
+ user = fjid if fjid.full else nick
self.participants.add(user)
- self.log.debug(f'participants: +{user} (len:{len(self.participants)})')
+ self.presences.update({nick: pres})
+ self.log.debug(f'participants: + {user}:{role}/{affi} (len:{len(self.participants)})')
await self.rtbl_ban(user)
+ @botcmd(name="rtbl-info")
+ def rtbl_info(self, rcv, _):
+ """Show RTBL info"""
+ if self.blocklist is None:
+ msg = 'Block list not populated yet'
+ self.log.warning(msg)
+ self.reply(rcv, msg)
+ return
+ msg = f'Got {len(self.blocklist)} items in {RTBL.pubsub_server}/{RTBL.node}'
+ if self.hits > 0:
+ msg+=f' (hits {self.hits})'
+ if not self.moderator:
+ msg+='\nBot has no moderator permissions!'
+ self.reply(rcv, msg)
+
if __name__ == '__main__':
from .cli.rtbl import main