#---------------------------------------------------------------------- # Name: bot.py # Purpose: Main class # # Author: Kristofer Goransson # # Created: 2003 Kristofer Goransson # Copyright: (c) 2003 # Licence: GPL #---------------------------------------------------------------------- import jabb, usero, rss, actions, stats import thread, cPickle, os, sys from time import strftime, localtime, sleep class Bot: def __init__(self): self.output('Starting NewsBot 0.45', 'purple') self.stats = stats.Stats(self) self.rss = rss.RSS(self, self.stats) self.jabber = jabb.Jabb(self) self.actions = actions.Actions(self, self.rss, self.stats) self.spammess = '' self.spamjid = '' self.spamcheck = 0 def startup(self): thread.start_new_thread(self.jabbconnect,()) thread.start_new_thread(self.rss.check,()) self.loadUsers() self.checkFeeds() self.input() def jabbconnect(self): self.jabber.connect() self.jabber.waitProcess() #-------------------------------------------- # Message methods #-------------------------------------------- def jabbrequest(self, fromjid, mess): self.stats.addReceived() #simple spam protection if self.spamjid == fromjid and self.spammess == mess: if self.spamcheck < 4: self.spamcheck += 1 else: return None else: self.spamjid = fromjid self.spamcheck = 0 self.spammess = mess if mess == 'addme': self.output('addme from %s' %fromjid, 'white') found = False jids = self.jabber.getJIDs() for jid in jids: if str(jid) == str(fromjid): found = True break if not found: self.jabber.addJID(fromjid) #send subscribe txt = 'Welcome! Authorize me!' else: txt = 'Error! You have already been added.' self.sendIM(fromjid, txt) else: found = False #print self.userlist for user in self.userlist: if str(user.getJID()) == str(fromjid): self.actions.doAction(user, mess) found = True break if not found: self.output('Error! %s not found!'%fromjid, 'red') # self.sendIM(fromjid, 'I don\'t know you. Please send a \'addme\' message!') #-------------------------------------------- # Send IM methods #-------------------------------------------- def sendIM(self, jid, msg): if len(msg) > 20: sendm = msg[0:20]+'...' else: sendm = msg sendm = sendm.replace('\n',' ') self.output('Sending "%s" to %s'%(sendm, jid)) self.stats.addSend() self.jabber.sendMessage(jid, msg) def sendMassIM(self, msg): for user in self.userlist: self.sendIM(user.getJID(), msg) sleep(1) #-------------------------------------------- # User methods #-------------------------------------------- def saveUsers(self): if self.userlist == []: os.remove('users.dat') else: file = open('users.dat','w') cPickle.dump(self.userlist, file) file.close() def loadUsers(self): self.output('Loading users...', 'white') if os.path.isfile('users.dat'): file = open('users.dat','r') self.userlist = cPickle.load(file) file.close() self.output('Loaded %s user(s)'%len(self.userlist), 'white') else: self.output('No users found. New userlist created!', 'white') self.userlist = [] def addUser(self, jid): for user in self.userlist: if str(user.getJID()) == str(jid): return False user = usero.User(jid) self.userlist.append(user) self.output('Added '+str(jid), 'green') return True def delUser(self, jid): found = False for user in self.userlist: if str(user.getJID()) == str(jid): self.sendIM(jid,'You have been removed from the bot!\nSend an \'addme\' message if you want to get readded.') self.userlist.remove(user) #remove from the userlist self.saveUsers() self.jabber.delJID(jid) #remove from presence,roster found = True if found: self.output('%s is removed from subscription and userlist'%jid, 'green') else: self.output('Didn\'t find user in userlist, trying to remove user from roster', 'white') jids = self.jabber.getJIDs() found = False for rosterjid in jids: if str(rosterjid) == jid: self.jabber.delJID(jid) found = True if found: self.output('%s is removed from roster'%jid, 'green') else: self.output('No such user in userlist or roster', 'red') def getUsers(self): return self.userlist #Checks if feed in user still extists. def checkFeeds(self): self.output('Checking userlist...','info') for user in self.userlist: print self.userlist names = user.getRss() found = False for name in names: for site in self.rss.getSites(): if site.getName() == name: found = True if not found: user.delRss(name) found = False #Readds the jids in roster to userlist def reUserlist(self): self.output('Readding users from Roster...','admin') jids = self.jabber.getJIDs() self.output('%s users in Roster.'%len(jids),'info') x = 0 for jid in jids: x += 1 self.output('%s Adding %s in userlist.'%(x, jid),'info') self.addUser(jid) #send mess to user? def getUserShowOk(self, user): #away, na, offline show = self.jabber.getShow(user.getJID()) if show == 'away': return user.getSetting('away') elif show == 'xa': return user.getSetting('na') else: if self.jabber.getOnline(user.getJID()): return True return user.getSetting('offline') #-------------------------------------------- # Misc admin methods #-------------------------------------------- def getUsersInfo(self): jids = self.jabber.getJIDs() self.output('Added JIDs in roster:', 'purple') x = 0 for jid in jids: x += 1 self.output('%s %s'%(x, jid), 'purple') self.output('Locally saved users:', 'purple') x = 0 for user in self.userlist: x += 1 self.output('%s %s'%(x, user.getJID()), 'purple') def emptyRoster(self): jids = self.jabber.getJIDs() for rosterjid in jids: #if rosterjid == jid: self.output('Removing %s'%rosterjid, 'white') self.jabber.delJID(rosterjid) sleep(3) #found = True """if found: self.output('%s is removed from roster'%jid, 'green') else: self.output('No such user in userlist or roster', 'red')""" def reroster(self, jid, num1, num2): if jid == 'all': x = 0 for user in self.userlist: x += 1 if x == int(num2): break elif x >= int(num1): jid = user.getJID() found = False jids = self.jabber.getStrJIDs() for rosterjid in jids: if rosterjid == jid: found = True break if not found: atpos = jid.find('@') if atpos != -1: jid = str(jid) dotpos = jid[atpos:].find('.') splitt = jid[atpos+dotpos-3:atpos+dotpos] if splitt == 'icq': icqserver = self.jabber.getIcqServer() icqnum = jid[:atpos] newjid = icqnum+'@'+icqserver #print 'newjid', newjid user.setJID(newjid) self.saveUsers() else: print 'error' self.jabber.addJID(user.getJID()) self.output('Added %s to roster %s'%(user.getJID(),x), 'green') sleep(5) else: self.output('%s already in roster'%user.getJID(), 'white') else: found = False for user in self.userlist: if user.getJID() == jid: found = True self.jabber.addJID(user.getJID()) self.output('Added %s to roster'%user.getJID(), 'green') break if not found: self.output('Didn\'t find jid: %s'%jid, 'red') self.output('Reroster done!', 'green') #-------------------------------------------- # Input/Output methods #-------------------------------------------- #fix this mess.... def input(self): while 1: input = raw_input() if input == 'help': self.output('Available commands:', 'purple') self.output('help - this', 'purple') self.output('logon - Logon', 'purple') self.output('register () - Register the bot', 'purple') self.output('unregister - Unregister the bot', 'purple') self.output('mess - Sends a message to everyone','purple') self.output('check - Performs check', 'purple') self.output('time - Shows the current check time','purple') self.output('feeds - Shows the news feed list', 'purple') self.output('delfeed - Removes a news feed', 'purple') self.output('users - Shows added users', 'purple') self.output('deluser - Removes an user','purple') self.output('reuserlist - Readd users to userlist from roster','purple') self.output('reroster - Reroster users from userlist','purple') self.output('emptyroster - Removes all users from roster','purple') self.output('stats - Statistics','purple') self.output('quit - Logout and exit','purple') elif input == 'logon': self.jabber.logon() elif input[0:8] == 'register': cmd = input.split(' ') if len(cmd) > 1: if cmd[1] == 'icq': self.output('Register on icq', 'white') self.jabber.register('icq') else: self.output('Wrong agent', 'red') else: self.output('Register on jabber', 'white') self.jabber.register() elif input == 'unregister': self.jabber.unregister() elif input[0:4] == 'mess': cmd = input.split(' ') if len(cmd) > 1: jidto = cmd[1] mess = ' '.join(cmd[2:]) mess = mess.decode('latin-1') self.output('Sending \'%s\' to %s!'%(mess,jidto), 'white') if jidto == 'all': for user in self.userlist: self.sendIM(user.getJID, mess) else: self.sendIM(jidto, mess) else: self.output('No message?', 'red') elif input == 'check': self.rss.doCheck(True) elif input == 'time': self.output('Current: %s min Check time: %s mins'%(self.rss.getDtime()/60, self.rss.getCHtime()/60), 'purple') elif input == 'feeds': sites = self.rss.getSites() self.output('News Feeds:', 'purple') self.output('#\tName', 'purple') for site in sites: self.output('%s\t%s'%(site.getNumber(), site.getName()), 'purple') elif input[:7] == 'delfeed': cmd = cmd = input.split(' ') if len(cmd) > 1: site = self.rss.getSite(cmd[1]) if site: self.rss.delSite(site) self.output('News feed removed!', 'purple') else: self.output('News feed not found. Wrong num or name.', 'purple') else: self.output('num/name is missing. Syntax: delfeed ', 'purple') elif input == 'users': self.getUsersInfo() elif input[:7] == 'deluser': cmd = input.split(' ') if len(cmd) > 1: self.delUser(cmd[1]) else: self.output('Jid is missing. Syntax: deluser ', 'purple') elif input[0:10] == 'reuserlist': self.reUserlist() elif input[0:8] == 'reroster': cmd = input.split(' ') if len(cmd) > 2: self.reroster(cmd[1], cmd[2], cmd[3]) else: self.output('Jid/All is missing. Syntax: reoster num num', 'purple') elif input == 'emptyroster': self.emptyRoster() elif input == 'stats': stats = self.stats.getStats() self.output('newsBot statistics:\nUptime: %s mins\nUsers: %s\nMessages sent/receieved: %s/%s\nNews checks: %s'%(stats[0],stats[1],stats[2],stats[3],stats[4]), 'purple') elif input == 'quit': self.jabber.disconnect() sys.exit(0) else: self.output('Unknown command. See \'help\'', 'purple') def output(self, txt, c=None): time = strftime("%H:%M:%S", localtime()) if sys.platform != 'win32': if c == 'green' or c == 'ok': color = '\x1b[1;32m' elif c == 'red' or c == 'error': color = '\x1b[1;31m' elif c == 'yellow' or c == 'warning': color = '\x1b[1;33m' elif c == 'purple' or c == 'admin': color = '\x1b[1;35m' elif c == 'white' or c == 'info': color = '\x1b[1;37m' else: color = '\x1b[0m' #gray print '[%s] %s%s \x1b[0m' %(time,color,txt) else: print '[%s] %s' %(time,txt) bot = Bot() bot.startup()