def load_plugin(input, loadAs=""): #Loads a plugin, placing it in it's correct category. state=0 #arguments=shlex.split(' '.join(input.split()[1:])) name=input.split()[0] x=__import__(name) if loadAs!="": name=loadAs else: loadAs = name if name in globalv.loadedPlugins: state=1 if name in globalv.loadedRealtime: state=1 if name in globalv.loadedSpecial: state=1 reload(x) y=x.pluginClass() if y.gettype()=="command": globalv.loadedPlugins.update({name:y}) if y.gettype()=="realtime": globalv.loadedRealtime.update({name:y}) if y.gettype()=="special": globalv.loadedSpecial.update({name:y}) if y.gettype()=="preprocess": globalv.loadedPreprocess.update({name:y}) if y.gettype()=="postprocess": globalv.loadedPostprocess.update({name:y}) globalv.aliasExtensions.update({name:''}) if settingsHandler.tableExists(name)==0: y.__init_db_tables__(name) if name not in [x[0] for x in settingsHandler.readSetting("'core-userlevels'", "plugin")]: settingsHandler.writeSetting("'core-userlevels'", ["plugin", "level"],[name, str(y.__level__())]) globalv.basePlugin[loadAs]=input.split()[0] return state
def expandExpansions(toExpand, complete=None): def runPluginReturnOutput(matchObj): command=expanDict[matchObj.group(1)] if matchObj.group(2) is not None: arguments=matchObj.group(2)[1:-1] else: arguments="" appendOnto=True for index, content in enumerate(arguments.split()): if "$%s$"%index in command: command=command.replace("$%s$"%index, content) appendOnto=False if "$*$" in command: command=command.replace("$*$",arguments) appendOnto=False if appendOnto: command="%s %s"%(command, arguments) inputString=":%s PRIVMSG %s :%s"%(toExpand.userMask(), toExpand.channel(), "!%s"%command) input=formatInput(pluginArguments(inputString)) pluginOutput=' | '.join(globalv.loadedPlugins[command.split()[0]].action(input)) output=' :'.join(pluginOutput.split(' :')[1:]) return output if type(toExpand) in [str,unicode]: isObj=False else: isObj=True if settingsHandler.tableExists("'core-expansions'")==False: settingsHandler.newTable("'core-expansions'","trigger","command") allCommands=[[x.replace('(','\(').replace(')', '\)'),x] for x in globalv.loadedPlugins.keys()] expansions=settingsHandler.readSettingRaw("'core-expansions'","trigger,command") + allCommands expanDict={} for trigger, command in expansions: expanDict[trigger]=command if isObj: string=toExpand.fullMessage() #if string.find("$%s$"%trigger)!=-1: if re.findall("(\$%s(\(.*?\))?\$)"%trigger, string)!=[]: string=re.sub("\$(%s)(\(.*?\))?\$"%trigger,runPluginReturnOutput,string) ret=toExpand.complete()[1:].split(' :',1) ret[1]=string toExpand.setComplete(':'+' :'.join(ret)) else: if complete==None: usermask="dummy!dummy@dummy" channel="#dummy" else: usermask=complete.userMask() channel=complete.channel() #if toExpand.find("$%s$"%trigger)!=-1: if re.findall("(\$%s(\(.*?\))?\$)"%trigger, toExpand)!=[]: toExpand=re.sub("\$(%s)(\(.*?\))?\$"%trigger,runPluginReturnOutput,toExpand) for variable in globalv.variables.keys(): if toExpand.fullMessage().find(variable)!=-1: string=re.sub("~%s~"%variable,str(globalv.variables[variable]),string) ret=toExpand.complete()[1:].split(' :',1) ret[1]=string toExpand.setComplete(':'+' :'.join(ret)) return toExpand
def load_alias(name, plugin): #Loads an alias try: if plugin.split()[0] in globalv.loadedPlugins: if plugin.split()[0] in globalv.aliasExtensions: argumentsObject = pluginArguments(":nothing!nobody@nowhere PRIVMSG #NARChannel :%s%s"%(globalv.commandCharacter, plugin)) argumentsObject = formatInput(argumentsObject, globalv.aliasExtensions, False) plugin = argumentsObject.fullMessage()[len(globalv.commandCharacter):] print plugin globalv.loadedPlugins.update({name:globalv.loadedPlugins[plugin.split()[0]]}) if settingsHandler.tableExists(name)==0: globalv.loadedPlugins[plugin.split()[0]].__init_db_tables__(name) if name not in [x[0] for x in settingsHandler.readSetting("'core-userlevels'", "plugin")]: settingsHandler.writeSetting("'core-userlevels'", ["plugin", "level"],[name, str(globalv.loadedPlugins[plugin.split()[0]].__level__())]) else: #If the aliases dependancy isn't loaded, load it, then get rid of it afterwards. load_plugin(plugin.split()[0]) globalv.loadedPlugins.update({name:globalv.loadedPlugins[plugin.split()[0]]}) if settingsHandler.tableExists(name)==0: globalv.loadedPlugins[plugin.split()[0]].__init_db_tables__(name) if name not in [x[0] for x in settingsHandler.readSetting("'core-userlevels'", "plugin")]: settingsHandler.writeSetting("'core-userlevels'", ["plugin", "level"],[name, str(globalv.loadedPlugins[plugin.split()[0]].__level__())]) unload_plugin(plugin.split()[0]) globalv.loadedAliases.update({name:plugin}) globalv.basePlugin[name] = plugin.split()[0] except Exception as detail: print detail try: message("Function syntax: "+globalv.commandCharacter+"alias [word] [command] [arguments]",info[2]) except: print "Plugin",name,"failed to load" try: print "Adding Extensions" print plugin globalv.aliasExtensions.update({name:" "+' '.join(plugin.split()[1:])}) except: globalv.aliasExtensions.update({name:''}) if globalv.aliasExtensions[plugin.split()[0]]!="": try: #globalv.aliasExtensions.update({name:globalv.aliasExtensions[plugin.split()[0]]}) print "Would have broken here" except: globalv.aliasExtensions.update({name:''})
def __init_db_tables__(self, name): if settingsHandler.tableExists("'" + name + "'") == False: settingsHandler.newTable("'" + name + "'", "answer") answers = [ "As I see it, yes", "It is certain", "It is decidedly so", "Most likely", "Outlook good", "Signs point to yes", "Without a doubt", "Yes", "Yes - definitely", "You may rely on it", "Reply hazy, try again", "Ask again later", "Better not tell you now", "Cannot predict now", "Concentrate and ask again", "Don't count on it", "My reply is no", "My sources say no", "Outlook not so good", "Very doubtful" ] for answer in answers: settingsHandler.writeSetting("'" + name + "'", "answer", answer)
def formatInput(arguments, aliases=globalv.aliasExtensions, preprocess=True): if settingsHandler.tableExists("'core-doNotExpand'")==False: settingsHandler.newTable("'core-doNotExpand'","doNotExpand") doNotExpand=[str(x[0]) for x in settingsHandler.readSettingRaw("'core-doNotExpand'","doNotExpand")] if aliases[arguments.cmd()[0]]!="": toAdd=aliases[arguments.cmd()[0]][1:] result=re.findall("\$([0-9][0-9]?[\+-]?)\$",toAdd) suchAThingExists=re.search('\$..?.?\$',toAdd) if result!=[]: for value in result: if value.find('+')==-1 and value.find('-')==-1: if (len(arguments.cmd()))>int(value): toAdd=toAdd.replace("$"+value+"$",arguments.cmd()[int(value)]) else: if int(value)!=1: toAdd=toAdd.replace("$"+value+"$"," ") else: toAdd=toAdd.replace("$"+value+"$",arguments.user()) elif value.find('+')!=-1: value=value[:-1] if (len(arguments.cmd()))>(int(value)-1): toAdd=toAdd.replace("$"+value+"+$",' '.join(arguments.cmd()[int(value):])) else: toAdd=toAdd.replace("$"+value+"+$"," ") elif value.find('-')!=-1: value=value[:-1] if (len(arguments.cmd()))>int(value): toAdd=toAdd.replace("$"+value+"-$",' '.join(arguments.cmd()[1:][:int(value)])) else: toAdd=toAdd.replace("$"+value+"-$"," ") if toAdd.find('$*$')!=-1: toAdd=toAdd.replace('$*$',' '.join(arguments.cmd()[1:])) if toAdd.find('$URL$')!=-1: toAdd=toAdd.replace('$URL$',' '.join(arguments.cmd()[1:]).replace(' ','%20')) if suchAThingExists!=None: msg=globalv.commandCharacter+arguments.cmd()[0]+" "+toAdd else: msg=arguments.complete()[1:].split(' :',1)[1]+aliases[arguments.cmd()[0]] ret=arguments.complete()[1:].split(' :',1) ret[1]=msg arguments.setComplete(':'+' :'.join(ret)) if arguments.cmd()[0] not in doNotExpand and preprocess: arguments=expand(arguments) return arguments
def load_plugin( input, loadAs=""): #Loads a plugin, placing it in it's correct category. state = 0 #arguments=shlex.split(' '.join(input.split()[1:])) name = input.split()[0] x = __import__(name) if loadAs != "": name = loadAs else: loadAs = name if name in globalv.loadedPlugins: state = 1 if name in globalv.loadedRealtime: state = 1 if name in globalv.loadedSpecial: state = 1 reload(x) y = x.pluginClass() if y.gettype() == "command": globalv.loadedPlugins.update({name: y}) if y.gettype() == "realtime": globalv.loadedRealtime.update({name: y}) if y.gettype() == "special": globalv.loadedSpecial.update({name: y}) if y.gettype() == "preprocess": globalv.loadedPreprocess.update({name: y}) if y.gettype() == "postprocess": globalv.loadedPostprocess.update({name: y}) globalv.aliasExtensions.update({name: ''}) if settingsHandler.tableExists(name) == 0: print 'Initializing tables for plugin "' + name + '"' y.__init_db_tables__(name) if name not in [ x[0] for x in settingsHandler.readSetting("'core-userlevels'", "plugin") ]: settingsHandler.writeSetting("'core-userlevels'", ["plugin", "level"], [name, str(y.__level__())]) globalv.basePlugin[loadAs] = input.split()[0] return state
def __init_db_tables__(self, name): if settingsHandler.tableExists("'"+name+"'")==False: settingsHandler.newTable("'"+name+"'","answer") answers=["As I see it, yes","It is certain","It is decidedly so","Most likely","Outlook good","Signs point to yes", "Without a doubt", "Yes", "Yes - definitely","You may rely on it", "Reply hazy, try again","Ask again later", "Better not tell you now","Cannot predict now","Concentrate and ask again","Don't count on it","My reply is no","My sources say no","Outlook not so good","Very doubtful"] for answer in answers: settingsHandler.writeSetting("'"+name+"'", "answer",answer)
send(formatOutput(returns, arguments)) if __name__=="__main__": #Load plugins and aliases. print "Loading plugins..." for plugin, loadAs in globalv.pluginList: load_plugin(plugin, loadAs) print "Loading aliases..." for line in settingsHandler.readSettingRaw("alias","aliasName, aliasPlugin, aliasArguments"): print line load_alias(line[0], ' '.join(line[1:])) print "Loading input sources..." if settingsHandler.tableExists("'core-input'"): for input in []: #settingsHandler.readSettingRaw("'core-input'","input, definition"): if input[0] not in globalv.loadedInputs.keys(): x=__import__(str(input[1].split()[0])) reload(x) arguments=str(' '.join(input[1].split()[1:])) arguments=arguments.split() globalv.loadedInputs[input[0]]=globalv.input.addInputSource(x.asyncInput,tuple(arguments)) else: globalv.loadedInputs[input[0]].put(str(input[1])) else: settingsHandler.newTable("'core-input'","input", "definition") for input in globalv.loadedInputs.keys(): globalv.loadedInputs[input].put("--init--") globalv.input.addInputSource(asyncInput) print "Loading output threads..."
class pluginClass(plugin): def gettype(self): return "realtime" def __init__(self): self.lastURLs = [] def __init_db_tables__(self, name): settingsHandler.newTable("tumblrdIgnores", "ignore") settingsHandler.newTable("tumblrd", "username", "password") def action(self, completeargs): def makeRequest(reqData, async=True): success = False failed = 0 if async else 14 while not success: try: con = urllib2.urlopen(req, None, 10) success = True except: failed += 1 print "Tumblrd failed", failed, "times." if failed > 15: success = True time.sleep(30) if not settingsHandler.tableExists("tumblrdIgnores"): settingsHandler.newTable("tumblrdIgnores", "ignore") complete = completeargs.complete()[1:].split(' :', 1) imageFileTypes = [".jpg", ".png", ".bmp"] username = settingsHandler.readSetting("tumblrd", "username") password = settingsHandler.readSetting("tumblrd", "password") ignores = [ x[0].lower() for x in settingsHandler.readSettingRaw("tumblrdIgnores", "ignore") ] if completeargs.channel().lower() in ignores or completeargs.user( ).lower() in ignores: return [""] if len(complete[0].split()) > 2: if complete[0].split()[1] == "PRIVMSG": msg = complete[1] sender = complete[0].split(' ') sender = sender[2] if msg.find('http://') != -1 or msg.find('https://') != -1: url = re.search(".*(?P<url>https?://.+?)[\".,?!]?\s", msg + " ").group("url") if url in self.lastURLs: return [""] else: self.lastURLs.append(url) if len(self.lastURLs) > 10: self.lastURLs.pop(0) logindata = { 'email': username, "password": password, "tags": ','.join((completeargs.channel(), completeargs.user())) } if url[-4:].lower() in imageFileTypes: uploaddata = {"type": "photo", "source": url} elif url.lower().find("youtube.com/watch") != -1: request = urllib2.urlopen(url) page = request.read(10000).replace('\n', '') print page title = re.findall("<\s*title\s*>(.*?)</title\s*>", page, re.I) print title title = title[0] uploaddata = { "type": "video", "embed": url, "caption": title } else: uploaddata = {"type": "link", "url": url} logindata.update(uploaddata) print logindata uploadData = urllib.urlencode(logindata) req = urllib2.Request("http://www.tumblr.com/api/write", uploadData) print "Constructing thread..." thread = threading.Thread(target=makeRequest, args=(req, )) print "Launching thread..." try: thread.start() print "Thread launched..." except: print "Thread failed to launch - using synchronous fallback" makeRequest(req, False) print "Sucessfully submitted data" return [""]
def __init_db_tables__(self, name): if settingsHandler.tableExists("'"+name+"'")==False: settingsHandler.newTable("'"+name+"'","answer")
def __init_db_tables__(self, name): if settingsHandler.tableExists("chohan") == False: settingsHandler.newTable("chohan", "nick", "points")
def __init_db_tables__(self, name): if settingsHandler.tableExists("chohan")==False: settingsHandler.newTable("chohan", "nick","points")
def load_alias(name, plugin): #Loads an alias try: if plugin.split()[0] in globalv.loadedPlugins: if plugin.split()[0] in globalv.aliasExtensions: argumentsObject = pluginArguments( ":nothing!nobody@nowhere PRIVMSG #NARChannel :%s%s" % (globalv.commandCharacter, plugin)) argumentsObject = formatInput(argumentsObject, globalv.aliasExtensions, False) plugin = argumentsObject.fullMessage()[len(globalv. commandCharacter):] print plugin globalv.loadedPlugins.update( {name: globalv.loadedPlugins[plugin.split()[0]]}) if settingsHandler.tableExists(name) == 0: globalv.loadedPlugins[plugin.split()[0]].__init_db_tables__( name) if name not in [ x[0] for x in settingsHandler.readSetting( "'core-userlevels'", "plugin") ]: settingsHandler.writeSetting("'core-userlevels'", [ "plugin", "level" ], [ name, str(globalv.loadedPlugins[plugin.split()[0]].__level__()) ]) else: #If the aliases dependancy isn't loaded, load it, then get rid of it afterwards. load_plugin(plugin.split()[0]) globalv.loadedPlugins.update( {name: globalv.loadedPlugins[plugin.split()[0]]}) if settingsHandler.tableExists(name) == 0: globalv.loadedPlugins[plugin.split()[0]].__init_db_tables__( name) if name not in [ x[0] for x in settingsHandler.readSetting( "'core-userlevels'", "plugin") ]: settingsHandler.writeSetting("'core-userlevels'", [ "plugin", "level" ], [ name, str(globalv.loadedPlugins[plugin.split()[0]].__level__()) ]) unload_plugin(plugin.split()[0]) globalv.loadedAliases.update({name: plugin}) globalv.basePlugin[name] = plugin.split()[0] except Exception as detail: print detail try: message( "Function syntax: " + globalv.commandCharacter + "alias [word] [command] [arguments]", info[2]) except: print "Plugin", name, "failed to load" try: print "Adding Extensions" print plugin globalv.aliasExtensions.update( {name: " " + ' '.join(plugin.split()[1:])}) except: globalv.aliasExtensions.update({name: ''}) if globalv.aliasExtensions[plugin.split()[0]] != "": try: #globalv.aliasExtensions.update({name:globalv.aliasExtensions[plugin.split()[0]]}) print "Would have broken here" except: globalv.aliasExtensions.update({name: ''})
# -*- coding: utf-8 -*- #Startup Script #Initialise Variables #Super important, deleting these is a Bad Idea import os import sys database=sys.argv[1] if len(sys.argv)>1 else "config.db" if not os.path.exists("config"): os.makedirs("config") import firstRun from asyncInputHandler import inputSystem from settingsHandler import readSetting, tableExists, readSettingRaw #First Run checkign if not tableExists("core"): firstRun.createDatabase() firstRun.createVariables() firstRun.createAutoload() loadedPlugins={} loadedRealtime={} loadedSpecial={} loadedPostprocess={} loadedPreprocess={} aliasExtensions={} loadedAliases={} accessRights={} ignoredUsers=[] bannedChannels=[] timeUsers={} channelUsers={} loadedInputs={} input=inputSystem()