#---------------------------------------------------------------------- # Name: actions.py # Purpose: User actions, commands # # Author: Kristofer Goransson # # Created: 2003 Kristofer Goransson # Copyright: (c) 2003 # Licence: GPL #---------------------------------------------------------------------- import time class Actions: def __init__(self, parent, rss, stats): self.main = parent self.stats = stats self.rss = rss def doAction(self, user, cmd): self.user = user self.main.output('%s is doing a %s'%(self.user.getJID(), cmd), 'white') lines = cmd.split('\n') for cmd in lines: if cmd != '': self.cmd = cmd.split(' ') type = self.cmd[0] type.replace('\n','') if type == 'feeds': messtxt = self.list() elif type == 'feed' and len(self.cmd) >= 3: if self.cmd[1] == 'new': messtxt = self.sitenew() elif self.cmd[1] == 'del': messtxt = self.sitedel() elif self.cmd[1] == 'name': messtxt = self.sitename() elif self.cmd[1] == 'url': messtxt = self.siteurl() elif self.cmd[1] == 'encoding': messtxt = self.siteencoding() elif self.cmd[1] == 'info': messtxt = self.siteinfo() else: messtxt = 'Wrong syntax. See \'help\'' elif type == 'settings': messtxt = self.settings() elif type == 'set' and len(self.cmd) == 3: messtxt = self.set() elif type == 'pause': messtxt = self.pause() elif type == 'add' and len(self.cmd) == 2: messtxt = self.add() elif type == 'del' and len(self.cmd) == 2: messtxt = self.delete() elif type == 'myfeeds': messtxt = self.mylist() elif type == 'latest': messtxt = self.latest() elif type == 'about': messtxt = self.about() elif type == 'stats': messtxt = self.botstats() elif type == 'delme': messtxt = self.delme() elif type == 'help': messtxt = self.help() else: messtxt = 'Unknown command. See \'help\'' if messtxt != None: self.main.sendIM(self.user.getJID(), messtxt) time.sleep(1) def list(self): sites = self.rss.getSites() line = '' linesp = ' ' if sites != []: for site in sites: if site.getNumber() < 10: space = ' ' else: space = '' if self.user.checkRss(site.getName()): added = '*' else: added = ' ' line += added+str(site.getNumber())+'\t'+site.getName() if len(site.getName()) < 7: tab = '\t\t\t' elif len(site.getName()) > 13: tab = '\t' else: tab = '\t\t' mins, secs = self._gettime(site) if mins == 0 and secs == 0: timeinfo = 'checking...\n' else: if secs < 10: secs = '0'+str(secs) if mins < 10: mins = '0'+str(mins) timeinfo = '%s:%s\n'%(mins, secs) line = line+tab+timeinfo title = self._title([' #','Name','Checktime'],[1,3,0]) bottom = '\n * = Added to your list.\nAdd a news feed to your list with: \'add \'\nNews feed information: \'feed info \'' return 'Available news feeds:\n'+title+line+bottom else: return 'No news feeds available. Add new with: \'feed new <(!)url>\'' def _title(self, list, tabs): txtline = '' tlength = 20 x = 0 for text in list: ntabs = tabs[x] tab = '' tlength += ntabs*4 for y in range(tabs[x]): tab += '\t' txtline += text+tab x += 1 line = '' for x in range(len(txtline)+tlength): line += '-' return txtline+'\n'+line+'\n' def sitenew(self): name = self.cmd[2] url = self.cmd[3] jid = self.user.getJID() if url[0] == '!': hidden = True url = url[1:] else: hidden = False result = self.rss.testItem(name, url, hidden, jid) return result def sitedel(self): namenum = self.cmd[2] site = self.rss.getSite(namenum) name = site.getName() if site: if site.getOwner() == self.user.getJID(): self.rss.delSite(site) for user in self.main.getUsers(): if user.checkRss(name): user.delRss(name) del site self.main.saveUsers() return 'Removed %s from site list.'%name else: return 'This command is only available to the owner(%s)!'%site.getOwner else: return 'News feed not found. Wrong name or number.' def sitename(self): namenum = self.cmd[2] site = self.rss.getSite(namenum) name = site.getName() if site: if site.getOwner() == self.user.getJID(): if self.rss.getSite(self.cmd[3]): site.setName(self.cmd[3]) self.rss.saveUrls() for user in self.main.getUsers(): if user.checkRss(name): user.delRss(name) user.addRss(self.cmd[3]) self.main.saveUsers() return '%s changed name to %s'%(name,self.cmd[3]) else: return 'Name already exists!' else: return 'This command is only available to the owner(%s)!'%site.getOwner() else: return 'News feed not found. Wrong name or number.' def siteurl(self): #add hide url and check namenum = self.cmd[2] site = self.rss.getSite(namenum) name = site.getName() if site: if site.getOwner() == self.user.getJID(): site.setUrl(self.cmd[3]) self.rss.saveUrls() return '%s changed url to %s'%(name,self.cmd[3]) else: return 'This command is only available to the owner(%s)!'%site.getOwner() else: return 'News feed not found. Wrong name or number.' def siteencoding(self): namenum = self.cmd[2] site = self.rss.getSite(namenum) if site: if site.getOwner() == self.user.getJID(): site.setEncoding(self.cmd[3]) self.rss.saveUrls() return '%s changed encoding to %s'%(site.getName(),self.cmd[3]) else: return 'This command is only available to the owner(%s)!'%site.getOwner() else: return 'News feed not found. Wrong name or number.' def siteinfo(self): site = self.rss.getSite(self.cmd[2]) if site: name = site.getName() link = site.getLink() number = site.getNumber() if site.getHidden(): url = 'Hidden' else: url = site.getUrl() encoding = site.getEncoding() owner = site.getOwner() added = site.getAdded() check = site.getCheck() mins, secs = self._gettime(site) return 'News feed information:\nName:\t\t%s\nLink:\t\t%s\nFeed url:\t%s\nNumber:\t%s\nEncoding:\t%s\nOwner:\t\t%s\nNews checks:\t%s\nAdded:\t\t%s\nChecktime:\t%sm %ss'%(name,link,url,number,encoding,owner,check,added, mins, secs) else: return 'News feed not found. Wrong name or number.' def settings(self): pause = self._getSetvalue('pause') offline = self._getSetvalue('offline') away = self._getSetvalue('away') na = self._getSetvalue('na') return 'Settings:\nPaused: %s\nReceive messages: Offline: %s Away: %s N/A: %s'%(pause,offline,away,na) def set(self): if self.cmd[1] == 'offline' or self.cmd[1] == 'away' or self.cmd[1] == 'na': if self.cmd[2] == 'yes' or self.cmd[2] == 'no': if self.cmd[2] == 'yes': val = True else: val = False self.user.setSetting(self.cmd[1], val) self.main.saveUsers() return 'Receive messages when %s: %s'%(self.cmd[1], self.cmd[2]) else: return 'Wrong value. Usage: set %s '%self.cmd[1] else: return 'Wrong syntax. Usage: set ' def _getSetvalue(self, val): sets = self.user.getSettings() if sets[val]: return 'Yes' else: return 'No' def pause(self): if self.user.getSetting('pause'): value = False mess = 'You are now unpaused.' else: value = True mess = 'You are now paused and won\'t receive news until you send a \'pause\' message again' self.user.setSetting('pause', value) self.main.saveUsers() return mess def add(self): site = self.rss.getSite(self.cmd[1]) if site: name = site.getName() if self.user.checkRss(name): return '%s has already been added' %name self.user.addRss(name) site.addAdded() self.main.saveUsers() return 'Added %s to your list' %name return 'Site not found. Wrong name or number.' def delete(self):#fix site = self.rss.getSite(self.cmd[1]) if site: name = site.getName() if self.user.checkRss(name): self.user.delRss(name) site.delAdded() self.main.saveUsers() return 'Removed %s from list' %name return 'Couldnt find %s in your list' %name return 'Site not found. Wrong name or number.' def mylist(self): if self.user.getRss(): title = self._title(['#', 'Name'],[1,2]) line = '' for name in self.user.getRss(): site = self.rss.getSite(name) if site: line += str(site.getNumber())+'\t'+site.getName()+'\n' return 'Added Rss feeds:\n'+title+line return 'No sites added. Use \'list\' and \'add (num/name)' def latest(self): if len(self.cmd) == 2: site = self.rss.getSite(self.cmd[1]) if site: return self.rss.getLatest(site) else: return 'Site not found. Wrong name or number.' else: if self.user.getRss() != []: latestnews = self.rss.getLatestUser(self.user) for news in latestnews: self.main.sendIM(self.user.getJID(), news) time.sleep(1) return 'Done!' else: return 'You don\'t have any sites available.' def about(self): try: text = open('changelog','r').read() except: self.main.output('Couln\'t open info file','red') return 'No info available...' else: return 'Changelog:\n'+text def _gettime(self, site): newsnum = self.rss.getNextNum() indexn = site.getNumber() if newsnum != indexn: if newsnum < indexn: timeuntil = (indexn-newsnum)*self.rss.getCHtime() timeuntil = timeuntil-self.rss.getDtime() elif newsnum > indexn: timeuntil = 1800-((newsnum-indexn)*self.rss.getCHtime()) timeuntil = timeuntil-self.rss.getDtime() secs = timeuntil%60 mins = (timeuntil-secs)/60 return mins, secs else: return 0, 0 def time(self): if len(self.cmd) == 2: namenum = self.cmd[1] site = self.rss.getSite(namenum) if site: mins, secs = self._gettime(site) return 'Checking %s in %sm %ss'%(site.getName(), mins, secs) else: return 'Does not compute! Couldn\'t find %s'%self.cmd[1] chtime = self.rss.getCHtime() dtime = self.rss.getDtime() site = self.rss.getNextItem() if dtime >= chtime: return 'Now checking %s'%site.getName() else: difftime = chtime - dtime secs = difftime%60 mins = (difftime-secs)/60 return 'Checking %s next in %sm %ss.'%(site.getName(),mins, secs) def botstats(self): stats = self.stats.getStats() uptime = stats[0] users = stats[1] sent = stats[2] received = stats[3] checks = stats[4] if uptime > 59: mins = uptime%60 hours = ((uptime-mins)/60)%24 days = (uptime-(hours*60))/1440 else: mins = uptime hours = 0 days = 0 return 'newsBot statistics:\nUptime: %s d %s h %s mins\nUsers: %s\nMessages sent/receieved: %s/%s\nNews checks: %s'%(days, hours, mins, users, sent, received, checks) def delme(self): self.main.delUser(self.user.getJID()) print 'donnar' return None def help(self): text = open('bothelp','r').read() return 'Bot help:\n'+text+'\n'