def process_data(self, data): """ For internal use only Processes incomming data """ self.lock.acquire() # An incomplete buffer is present: add to data and clear if self.incomplete_buffer: data = self.incomplete_buffer + data self.incomplete_buffer = "" # Test to see if we have an incomplete line at end # If so we will add it to the incomplete buffer # as we process the data if data[-2:] == "\r\n": split_data = data.split("\r\n") else: split_data = data.split("\r\n") self.incomplete_buffer = split_data.pop(-1) for line in split_data: if line: if line.startswith('PING'): parameters = line.split() pong = 'PONG ' + parameters[1] self.send(pong) self.lock.release() return eyercbot.send('process message', self.name, line) self.lock.release()
def irc_PART(self, server, prefix, params): user, host = prefix.split('!') channel = params[0] reason = "" if len(params) > 1: reason = params[1] eyercbot.send('onPart', server, user, host, channel, reason)
def irc_RPL_WELCOME(self, server, prefix, arguments): """ Welcome from server, we launch, call signedOn """ nick = arguments[0] message = arguments[1] eyercbot.send('signed on', server, nick, message)
def message(server, user, target, msg): '''Message logic to determine how to send response based on query (prv vs pub) Use msg() or notice() to overide this behavior.''' if target.lower() == eyercbot.config['nick'].lower(): # Get by pm, respond by pm #self.msg(user.split('!')[0], msg[0:eyercbot.config['length']]) target = user.split('!')[0] else: # Get by public, respond by public rep = 'awesomepants' msg = msg.lower().replace('bitch', rep) msg = msg.lower().replace('f****t', rep) msg = msg.lower().replace('f*g', rep) msg = msg.lower().replace('f**k', rep) msg = msg.lower().replace('shit', rep) msg = msg.lower().replace('nigger', rep) msg = msg.lower().replace('c**t', rep) lines = 0 for x in range(int(len(msg)/eyercbot.config['length'])+1): message = msg[lines:lines+eyercbot.config['length']] if not len(message): return eyercbot.send('msg', server, target, message) time.sleep(0.5) lines += eyercbot.config['length']
def delete(server, user, target, message): if message.lower() in database: del database[message.lower()] eyercboot.send('sendMsg', server, user, target, message + ' deleted.') saveDB(eyercbot.config['basedir'] + 'faq.yaml') else: eyercbot.send('sendMsg', server, user, target, "There is no entry with that key in the database.")
def whoami(server, user, target, message): '''Reports to user what the bot knows about them''' userO = userdb.getUser(user) eyercbot.send( 'sendMsg', server, user, target, "You are: " + userO.nick + " in group " + userO.group + '. Registration: ' + str(userO.registered) + '. Permissions: ' + str(userO.permissions))
def add_whitelist(server, user, target, message): '''@add whitelist group_name, whitelist.function | Adds whitelist to target group.''' if len(message.split(', ')) != 2: eyercbot.send('sendMsg', server, user, target, "Invalid syntax") return group_name, permission = message.split(', ') eyercbot.send('sendMsg', server, user, target, "Unfinished function")
def join(server, channel): """ Join the specified channel """ # If # and & is missing, add it if channel[0] != "#" and channel[0] != '&': channel = "#" + channel eyercbot.send('send', server, 'JOIN {0}'.format(channel))
def irc_KICK(self, server, prefix, params): """Kicked? Who? Not me, I hope. """ kicker = prefix.split('!')[0] channel = params[0] kicked = params[1] message = params[-1] eyercbot.send('onKick', server, kicked, channel, kicker, message)
def irc_JOIN(self, server, prefix, params): """ Called when a user joins a channel. """ nick = prefix.split('!')[0] host = prefix.split('!')[1] channel = params[-1] eyercbot.send('onJoin', server, nick, host, channel)
def join_quote(server, nick, channel): '''Random quote is posted if user joins that channel''' if server in eyercbot.config['plugin_config']['quotes']['join_quotes']: if channel in eyercbot.config['plugin_config']['quotes']['join_quotes'][server]: quotedb = makeQuoteDB() if nick in quotedb: quote_entry = getQuote(nick = nick, param = "random") eyercbot.send('msg', server, channel, quote_entry)
def newuser(server, user, msg): '''First user to PM their password will be registered as owner''' user_name = user.split('!')[0] eyercbot.users.userdb.makeEntry(user_name) eyercbot.users.userdb.database[user_name].register(user, msg.split()[1], 'owner') # We now write the new user file eyercbot.users.userdb.save(user_name) eyercbot.send('msg', server, user_name, 'You have been registered as my owner')
def joined(server, nick, host, channel): """ Called when someone joins a channel """ if nick == botnick: eyercbot.send('onBotJoin', server, channel) else: eyercbot.send('onUserJoin', server, nick, channel)
def irc_RPL_TOPIC(self, server, prefix, params): """ Called when the topic for a channel is initially reported or when it subsequently changes. """ user = prefix channel = params[1] new_topic = params[2] eyercbot.send('onTopic', server, user, channel, new_topic)
def stats(server, user, target, message): """Outputs quote database stats""" quotedb = makeQuoteDB() stats = "" if not quotedb: stats = "No quotes stored" else: for nick in quotedb: stats = stats + nick + ': ' + str(len(quotedb[nick])) + ' ' eyercbot.send('sendMsg', server, user, target, 'Quote Statistics: ' + stats)
def loadAllPlugins(): # Unloading anythign we have # Inhibit the dynamic view to allow mutability during iteration for plugin in list(plugins.keys()): unload_plugin(plugin) stop = False for plugin_name in eyercbot.config['plugins']: if loadPlugin(plugin_name): stop = True if stop: eyercbot.send('quitAll', "!!!!ATTENTION!!!! There have been critical updates to " + eyercbot.config["nick"] + " config file and the bot will now shut down. Please review configuration before restarting.")
def search(server, user, target, message): '''Searches for a word or phrase.''' matches = set() for topic, entry in database.items(): if message.lower() in topic.lower() or message.lower() in entry.lower(): matches.add(topic) if not matches: eyercbot.send('sendMsg', server, user, target, "No match found") else: message = '' for entry in matches: message += entry + ', ' eyercbot.send('sendMsg', server, user, target, "Matches: " + message[:-2])
def add(server, user, target, message): '''add quote line to be quoted tags:tag1,tag2 will add the quote to the user. Tags are optional parameters for searching purposes. Tags can not have spaces.''' nick, quote = message.split(" ", 1) tags = [] if "tags:" in quote: quote, temp_tags = quote.split("tags") tags = temp_tags.split(",") quote_submitter = user.split("!")[0] quote_entry = [quote_submitter, quote, tags] user = eyercbot.users.userdb.getUser(nick) try: user.quotes.append(quote_entry) except: user.quotes = [quote_entry] eyercbot.users.userdb.save(user.nick) eyercbot.send('sendMsg', server, user, target, 'Successfully added quote for ' + nick + '.')
def randomQuote(server, user, target, message): """Calls a random quote from the quote db. An optional parameter can be given.""" nick = None tag = None # If there is a message... if message: # Message is split as we are only passing one word message = message.split()[0] quotedb = makeQuoteDB() # This a user name if message.lower() in quotedb: nick = message.lower() else: tag = message.lower() quote_entry = getQuote(nick = nick, tag = tag, param = "random") eyercbot.send('sendMsg', server, user, target, quote_entry)
def weather(server, user, target, message): '''Prints out current weather conditions for tartget city. Parameters can include city, state; city, country; and US postal zip codes.''' if not message: eyercbot.send('sendMsg', server, user, target, weather.__doc__) url = 'http://www.google.com/ig/api?' + urlencode({'weather': message}) weather_xml = urllib.request.urlopen(url).read().decode() root = etree.fromstring(weather_xml) weather_element = root[0] forcast_info = weather_element[0] current_conditions = weather_element[1] cityname = forcast_info.findall('city')[0].attrib['data'] condition = current_conditions.findall('condition')[0].attrib['data'] tempf = current_conditions.findall('temp_f')[0].attrib['data'] tempc = current_conditions.findall('temp_c')[0].attrib['data'] wind = current_conditions.findall('wind_condition')[0].attrib['data'] response = 'Weather for ' + cityname + ': Temperature: ' + tempc + 'C (' + tempf + ' F). Condition: ' + condition + '. ' + wind eyercbot.send('sendMsg', server, user, target, response)
def irc_PRIVMSG(self, server, prefix, parameters): """ Called when we get a private message. We then pipe to three possible functions: funcname1: called for all private message funcname2: called for all messages in channels funcname3: called for all messages directly sent from users """ sender = prefix target = parameters[0] message = parameters[-1] # Return if we got a blank message if not message: return # The logic which manages public vs private messages will be done one more level up. eyercbot.send('onMsg', server, sender, target, message)
def publicmsg(server, nick, target, message): '''Reads the message, looking for specific things to autofetch and post.''' # Youtube title if 'http://www.youtube.com/watch' in message: re1 = '((?:http|https)(?::\\/{2}[\\w]+)(?:[\\/|\\.]?)(?:[^\\s"]*))' # HTTP URL 1 rg = re.compile(re1, re.IGNORECASE | re.DOTALL) m = rg.search(message) if m: url = m.group(1) response, content = browser.request(url) html = content.decode() query = re.search('<title>(?P<title>.+?)</title>', html, flags=re.DOTALL) title = query.group('title').replace('\n', '') eyercbot.send('msg', server, target, title)
def new(server, user, target, message): a = False while a == False: text, title = wiki() a = wikicheck(text) text = eyercbot.html2irc(text) if len(text) > 450: text = text[0:450] wiki_story = [[], []] while len(wiki_story[1]) < 2: wiki_story = encodetext(text) story = {'text':wiki_story[0], 'list':wiki_story[1]} #stream = file('madlib.yaml', 'w') #yaml.dump_all([story, title], stream) #stream.close() eyercbot.memory['madlibs'] = Game(server, target, story, user.split('!')[0], title) eyercbot.memory['madlibs'].allow_join = True eyercbot.send('sendMsg', server, target, 'A new game of Madlibs is starting Please type @join madlib to join the game. The game owner can type @start madlib to start the game.')
def auto_steam(*args): log.info("Automatic steam update") for userO, game in steamers.items(): update = False database = get_steam(userO.steamID64) if 'gameextrainfo' in database and steamers[userO] == None: update = True steamers[userO] = database['gameextrainfo'] elif 'gameextrainfo' not in database: steamers[userO] = None elif 'gameextrainfo' in database: if steamers[userO] != database['gameextrainfo']: update = True steamers[userO] = database['gameextrainfo'] if update: for server in eyercbot.config['plugin_config']['steam']['servers']: for channel in eyercbot.config['plugin_config']['steam']['servers'][server]: eyercbot.send('msg', server, channel, userO.nick + " is now playing " + database['gameextrainfo'])
def update(file_name, server, channel, auto=False): subprocess.call([ eyercbot.config['plugin_config']['stats']['pisg_path'], '-co', eyercbot.config['plugin_config']['stats']['cfg_path'] ]) if eyercbot.config['plugin_config']['stats']['use_ftp']: upload(file_name) if eyercbot.config['plugin_config']['stats']['use_move']: copy(file_name) if auto: eyercbot.send( 'msg', server, channel, eyercbot.config['plugin_config']['stats']['auto_message'] + eyercbot.config['plugin_config']['stats']['url'] + file_name.lstrip('#')) else: eyercbot.send( 'msg', server, channel, eyercbot.config['plugin_config']['stats']['man_message'] + eyercbot.config['plugin_config']['stats']['url'] + file_name)
def google(server, user, target, message): """Perform a search using Google's AJAX API. search("search phrase", options={}) Valid options are: smallsearch - True/False (Default: False) filter - {active,moderate,off} (Default: "moderate") language - Restrict search to documents in the given language (Default: "lang_en") """ query = message headers = default_headers opts = {'q': query, 'v': '1.0'} url = urllib.request.Request(google_search_url + "?" + urlencode(opts), headers=headers) page = urllib.request.urlopen(url) results = json.loads(page.read().decode()) page.close() url = results['responseData']['cursor']['moreResultsUrl'] if not results['responseData']['results']: eyercbot.send('sendMsg', server, user, target, 'I found no results for that query.') return response = '' + results['responseData']['results'][0][ 'titleNoFormatting'] + ': ' + results['responseData']['results'][0][ 'url'] + ' | ' + results['responseData']['results'][0]['content'] eyercbot.send( 'sendMsg', server, user, target, eyercbot.html2irc(response) [0:eyercbot.config["plugin_config"]["search"]["length"]]) eyercbot.send('sendMsg', server, user, target, url)
def get_feed(server, user, target, message, auto=False): if not message: eyercbot.send('sendMsg', server, user, target, 'Please enter a feed name') return key = message if key not in eyercbot.config['plugin_config']['feed']['feeds']: eyercbot.send('sendMsg', server, user, target, 'Feed does not exist.') return response, content = browser.request( eyercbot.config['plugin_config']['feed']['feeds'][key]['url']) data = content.decode(response['content-type'].split('=')[1]) tree = etree.fromstring(data) channel = tree.getchildren()[0] feedtitle = channel.find('title').text feedlink = channel.find('link').text child = channel.find('item') title = child.find('title').text link = child.find('link').text guid = child.find('guid').text if eyercbot.config['plugin_config']['feed']['feeds'][key][ 'lastid'] == guid and auto: return content = eyercbot.bbcode2irc( eyercbot.html2irc( child.find( '{http://purl.org/rss/1.0/modules/content/}encoded').text)) response = 'From: ' + feedtitle eyercbot.send('sendMsg', server, user, target, response) response = '' + title + ': ' + content #print("response:",response[0:400]) eyercbot.send( 'sendMsg', server, user, target, response[:eyercbot.config['plugin_config']['feed']['length']]) eyercbot.send('sendMsg', server, user, target, link) eyercbot.config['plugin_config']['feed']['feeds'][key] eyercbot.config['plugin_config']['feed']['feeds'][key]['lastid'] = guid
def signed_on(server, nick, message): """ Called after sucessfully signed into the server """ # Join designated channels global botnick botnick = nick for channel in eyercbot.config['servers'][server]['channels']: eyercbot.send('join channel', server, channel) message = "EyeRCBot Version " + str(eyercbot.VERSION) + ". Python version: " + str(sys.version) eyercbot.send('msg', server, channel, message) message = "The following plugins have been loaded: " for name in plugins.keys(): message = message + name + ", " eyercbot.send('msg', server, channel, message[:-2]) message = "Commands begin with " + eyercbot.config['servers'][server]["command"] + '. ' + eyercbot.config['servers'][server]["command"] + 'help to begin.' eyercbot.send('msg', server, channel, message)
def add(server, user, target, message): '''Creates new entry. Format is @add faq key phrase, entry for key.''' data = message.split(', ', 1) if len(data) != 2: eyercbot.send('sendMsg', server, user, target, "Incorrect paramaters") elif data[0] in database.keys(): eyercbot.send('sendMsg', server, user, target, "Key already exists, please delete first.") else: database[data[0].lower()] = data[1] saveDB(eyercbot.config['basedir'] + 'faq.yaml') eyercbot.send('sendMsg', server, user, target, data[0].lower() + " added to database.")
def show_steam(server, user, target, message): if len(message.split()): userO = eyercbot.users.userdb.getUser(message.split()[0]) else: userO = eyercbot.users.userdb.getUser(user) try: eyercbot.send('sendMsg', server, user, target, userO.nick + " steam ID: " + str(userO.steamID64)) except: if userO.nick: eyercbot.send('sendMsg', server, user, target, "I do not have a steam ID for " + userO.nick) else: eyercbot.send('sendMsg', server, user, target, "I do not have a steam ID for that user.") return database = get_steam(userO.steamID64) if 'gameextrainfo' in database: eyercbot.send('sendMsg', server, user, target, userO.nick + ' (aka ' + database['personaname'] + ') currently playing: ' + database['gameextrainfo']) steamers[userO] = database['gameextrainfo'] else: steamers[userO] = None