Difference between revisions of "IRC Bot"

From Unallocated Space
Jump to navigation Jump to search
Line 89: Line 89:
 
         data=data[0:data.find("</link>")]
 
         data=data[0:data.find("</link>")]
 
         return 'Last Post: '+title+" - "+data
 
         return 'Last Post: '+title+" - "+data
 +
 +
def nowplaying(data):
 +
try:
 +
        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 +
        s.connect(('192.168.50.133',8000))
 +
        message=s.recv(1024)
 +
        s.close()
 +
except socket.error:
 +
        message="The music machine is not on, or is not responding."
 +
return ''.join([x for x in message if ord(x) < 128]).strip()
  
 
def help(data):
 
def help(data):
Line 102: Line 112:
 
                 'weather':'!weather returns the weather conditions outside the space.',
 
                 'weather':'!weather returns the weather conditions outside the space.',
 
                 'address':address(None),
 
                 'address':address(None),
                 'request':'!request is used to make improvment or feature requests for UnalloBot.'
+
                 'request':'!request is used to make improvment or feature requests for UnalloBot.',
 +
'wiki':'!wiki when used with text returns a link most closely related to the search term on the Unallocated Wiki.',
 +
'link':'!link returns various links to Unallocated Space related web pages. List can be altered here: http://www.unallocatedspace.org/wiki/Links',
 +
'video':'!video queries the Unallocated Space youtube account and returns the top result.'
 
                 }
 
                 }
 
         return helps[data] if data in helps else 'Available commands are: !'+' !'.join(helps.keys())
 
         return helps[data] if data in helps else 'Available commands are: !'+' !'.join(helps.keys())
Line 125: Line 138:
  
 
def weather(data):
 
def weather(data):
 +
print 123
 
usock = urllib.urlopen('http://www.google.com/ig/api?weather=21144')
 
usock = urllib.urlopen('http://www.google.com/ig/api?weather=21144')
 
xmldoc = minidom.parse(usock)
 
xmldoc = minidom.parse(usock)
Line 134: Line 148:
 
return data
 
return data
  
def mcpipe(data):#fix for the securities
+
def links(data):
 +
        data=data.lower()
 +
        usock = urllib.urlopen('http://www.unallocatedspace.org/wiki/Links')
 +
        xmldoc = minidom.parse(usock)
 +
        usock.close()
 +
        results=xmldoc.getElementsByTagName('p')[1].getElementsByTagName('a')
 +
        for dat in results:
 +
                if data in str(dat.toxml()).lower().split('{0}')[1:-1]:
 +
                        return 'Link for '+data+': '+str(dat.getAttribute('href'))
 +
        return 'Nothing could be found.'
 +
 
 +
def youtube(data):
 +
if data != '':
 +
        usock = urllib.urlopen('https://gdata.youtube.com/feeds/api/videos?author=TheUnallocated&max-results=1&q=%s' % data)
 +
        xmldoc = minidom.parse(usock)
 +
        usock.close()
 +
        if '>0<' not in xmldoc.getElementsByTagName('openSearch:totalResults')[0].toxml():
 +
                title=xmldoc.getElementsByTagName('entry')[0].getElementsByTagName('title')[0].toxml()[19:-8]
 +
                link =xmldoc.getElementsByTagName('entry')[0].getElementsByTagName('link')[0].getAttribute('href')[0:-22]
 +
                return title+': '+link
 +
        return 'Nothing has been found'
 +
else:
 +
return 'Use this command with text to query the Unallocated Space youtube account for video.'
 +
 
 +
def mcpipe(data):
 
return 'Not right now.'
 
return 'Not right now.'
 
os.system("echo 'say "+data+" (!irc to reply)' > /home/minecraft/minecraft/mcpipe")
 
os.system("echo 'say "+data+" (!irc to reply)' > /home/minecraft/minecraft/mcpipe")
Line 151: Line 189:
 
                 return "The space is closed, Rollcall is not allowed"
 
                 return "The space is closed, Rollcall is not allowed"
  
def goingson(data): #this may be removed....
+
def goingson(data):
 
os.system("echo '"+status(None)+"' > /uas/irc/irc ")
 
os.system("echo '"+status(None)+"' > /uas/irc/irc ")
 
time.sleep(.1)
 
time.sleep(.1)
Line 165: Line 203:
 
return ""
 
return ""
  
def request(data): #this may be removed....
+
def wiki(data):
 +
if data:
 +
        data=urllib.urlopen('http://www.unallocatedspace.org/wik/index.php?title=Special:Search&search=%s&&fulltext=Search' % data).read()
 +
        if "There were no results matching the query." in data:
 +
                return "Nothing could be found."
 +
        elif "<ul class='mw-search-results'>\n<li><a href=" in data:
 +
                data=data[data.find("<ul class='mw-search-results'>\n<li><a href=")+44:]
 +
                data=data[0:data.find('" title')]
 +
                return 'Closest Match: http://www.unallocatedspace.org'+data
 +
        return 'Something strange occured.'
 +
else:
 +
return 'Use this command with text to search the wiki.'
 +
 
 +
def request(data):
 
if data != "":
 
if data != "":
 
        f=open('requests.txt','a')
 
        f=open('requests.txt','a')
Line 213: Line 264:
 
                 'goingson allthethings':goingson,
 
                 'goingson allthethings':goingson,
 
                 'request':request,
 
                 'request':request,
                 'alert':alert$,
+
                 'alert':alert,
 
                 'help commands':help,
 
                 'help commands':help,
 
                 'wiki':wiki,
 
                 'wiki':wiki,
Line 224: Line 275:
  
 
responder_commands={'status':status,'rollcall':rollcall,'tweet':tweet,'site':site,'sign':sign,'weather':weather,'address':address}
 
responder_commands={'status':status,'rollcall':rollcall,'tweet':tweet,'site':site,'sign':sign,'weather':weather,'address':address}
 +
 +
  
 
</pre>
 
</pre>

Revision as of 14:36, 17 October 2011

Version 2.6

Major addition to 2.5 is the ability to add new commands and edit old commands on the fly by editing botfunc.py then echoing "update" into the irc named pipe.

Related: IRC & Minecraft

bot.py

#!/usr/bin/env python
import socket,urllib,sys,threading,time,serial,botfunc

class pipein(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
	threading.Thread.daemon = True

    def run (self):
      global irc
      while True:
         tmp=sys.stdin.readline().strip()
         if tmp !=  "":
	    if tmp == "update":
		reload(botfunc)
	    else:
	    	irc.send('PRIVMSG #unallocatedspace :\001ACTION '+tmp.strip()+'\001\r\n')
            print tmp.strip()
         time.sleep(1)


while True:
	try:
                network = 'irc.mzima.net'
		network = 'irc.prison.net'

	
		port=6667
		irc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
		irc.connect((network,port))
	
		print irc.recv(4096)
		irc.send('NICK UnalloBot\r\n')
		irc.send('USER UnalloBot UnalloBot UnalloBot :Unallocated Bot\r\n')
		irc.send('VERSION 2\r\n')
		irc.send('JOIN #unallocatedspace\r\n')

		pipein().start()

		while True:
			data=irc.recv(4096)
			if data.find('PING')!=-1:
				irc.send ('PONG '+data.split()[1]+'\r\n')
			elif data.find('PRIVMSG #unallocatedspace :!')!=-1:
		                data=data[data.find(' :!')+3:].strip()
		                command,u,data=data.partition(" ")
				if command in botfunc.commands:
					botfunc.send(irc,botfunc.commands[command](data.strip()))
	except:
		print "something fucked up"
	time.sleep(30)



botfunc.py

import socket,urllib,time,serial,os,string
from xml.dom import minidom


def send(irc,text):
	if text.strip()!="":
	        irc.send('PRIVMSG #unallocatedspace :\001ACTION '+str(text).strip()+'\001\r\n')

def status(data):
	return open('/tmp/status').read()[1:]

def tweet(data):
        data=urllib.urlopen('https://twitter.com/statuses/user_timeline/165951985.rss?count=1').read()
        data=data.replace('\n',' ')
        data= data[data.find('<item>')+31:]
        return "Last Tweet: "+data[0:data.find('</title>')]

def site(data):
        data=urllib.urlopen('http://www.unallocatedspace.org/uas/feed/rss/').read()
        data=data[data.find('<item>')+16:]
        title=data[0:data.find("</title>")]
        data=data[data.find('<link>')+6:]
        data=data[0:data.find("</link>")]
        return 'Last Post: '+title+" - "+data

def nowplaying(data):
	try:
	        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        	s.connect(('192.168.50.133',8000))
	        message=s.recv(1024)
	        s.close()
	except socket.error:
	        message="The music machine is not on, or is not responding."
	return ''.join([x for x in message if ord(x) < 128]).strip()

def help(data):
        data=data.replace('!','')
        helps={
                'status':'!status returns the current status of the space. (open/closed)',
                'sign':'!sign returns or updates the text displayed on the prolite LED sign.',
                'tweet':'!tweet returns the latest tweet on the @Unallocated twitter account.',
                'site':'!site returns the latest blog post on http://unallocatedspace.org/',
                'mc':'!mc facilitates live communication with people playing on the Unallocated Minecraft server. (not active right now)',
                'rollcall':'!rollcall lists Unallocated Space members that have checked into the space with their UAS member smart cards during the current session (opening to closing)',
                'phone':'!phone prints the phone number of the space. 512-943-2827. ooh how meta.',
                'weather':'!weather returns the weather conditions outside the space.',
                'address':address(None),
                'request':'!request is used to make improvment or feature requests for UnalloBot.',
		'wiki':'!wiki when used with text returns a link most closely related to the search term on the Unallocated Wiki.',
		'link':'!link returns various links to Unallocated Space related web pages. List can be altered here: http://www.unallocatedspace.org/wiki/Links',
		'video':'!video queries the Unallocated Space youtube account and returns the top result.'
                }
        return helps[data] if data in helps else 'Available commands are: !'+' !'.join(helps.keys())

def sign(data):	
        try:
                if data=="":
                        message='The last sign update read as: '+open('/tmp/sign','r').read()
                else:
                        if '<FO>' in data:
                                message="<FO> is not allowed"
                        else:
                                s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                                s.connect(('127.0.0.1',9001))
                                s.sendall(data)
                                message=s.recv(1024)
                                s.close()
					
        except socket.error:
                message="Failed to update sign"
        return message

def weather(data):
	print 123
	usock = urllib.urlopen('http://www.google.com/ig/api?weather=21144')
	xmldoc = minidom.parse(usock)
	usock.close()
	data=xmldoc.getElementsByTagName('current_conditions')[0].getElementsByTagName('condition')[0].getAttribute('data').strip() + ' - '
	data+="Temp: "+xmldoc.getElementsByTagName('current_conditions')[0].getElementsByTagName('temp_f')[0].getAttribute('data').strip() + ' - '
	data+=xmldoc.getElementsByTagName('current_conditions')[0].getElementsByTagName('humidity')[0].getAttribute('data').strip() + ' - '
	data+=xmldoc.getElementsByTagName('current_conditions')[0].getElementsByTagName('wind_condition')[0].getAttribute('data').strip()
	return data

def links(data):
        data=data.lower()
        usock = urllib.urlopen('http://www.unallocatedspace.org/wiki/Links')
        xmldoc = minidom.parse(usock)
        usock.close()
        results=xmldoc.getElementsByTagName('p')[1].getElementsByTagName('a')
        for dat in results:
                if data in str(dat.toxml()).lower().split('{0}')[1:-1]:
                        return 'Link for '+data+': '+str(dat.getAttribute('href'))
        return 'Nothing could be found.'

def youtube(data):
	if data != '':
	        usock = urllib.urlopen('https://gdata.youtube.com/feeds/api/videos?author=TheUnallocated&max-results=1&q=%s' % data)
	        xmldoc = minidom.parse(usock)
	        usock.close()
	        if '>0<' not in xmldoc.getElementsByTagName('openSearch:totalResults')[0].toxml():
	                title=xmldoc.getElementsByTagName('entry')[0].getElementsByTagName('title')[0].toxml()[19:-8]
	                link =xmldoc.getElementsByTagName('entry')[0].getElementsByTagName('link')[0].getAttribute('href')[0:-22]
	                return title+': '+link
	        return 'Nothing has been found'
	else:
		return 'Use this command with text to query the Unallocated Space youtube account for video.'

def mcpipe(data):
	return 'Not right now.'
	os.system("echo 'say "+data+" (!irc to reply)' > /home/minecraft/minecraft/mcpipe")
	return ''

def rollcall(data):
        status=open("/tmp/status").read()
        if status[0:1]=="+":
                peps=open("/uas/smart/whoishere").read().strip()
                peeps = ', '.join(list(set(peps.split('\n'))))
                if peeps.strip() != "":
                        return "The following people have checked into the space this session. "+peeps[0:]
                else:
                        return "No one has checked into the space this session."
        else:
                return "The space is closed, Rollcall is not allowed"

def goingson(data):
	os.system("echo '"+status(None)+"' > /uas/irc/irc ")
	time.sleep(.1)
	os.system("echo '"+rollcall(None)+"' > /uas/irc/irc ")
        time.sleep(.1)
        os.system("echo '"+sign("")+"' > /uas/irc/irc ")
        time.sleep(.1)
        os.system("echo '"+site(None)+"' > /uas/irc/irc ")
        time.sleep(.1)
        os.system("echo '"+tweet(None)+"' > /uas/irc/irc ")
	time.sleep(.1)
        os.system("echo '"+weather(None)+"' > /uas/irc/irc ")
	return ""

def wiki(data):
	if data:
	        data=urllib.urlopen('http://www.unallocatedspace.org/wik/index.php?title=Special:Search&search=%s&&fulltext=Search' % data).read()
	        if "There were no results matching the query." in data:
	                return "Nothing could be found."
	        elif "<ul class='mw-search-results'>\n<li><a href=" in data:
	                data=data[data.find("<ul class='mw-search-results'>\n<li><a href=")+44:]
	                data=data[0:data.find('" title')]
	                return 'Closest Match: http://www.unallocatedspace.org'+data
	        return 'Something strange occured.'
	else:
		return 'Use this command with text to search the wiki.'

def request(data):
	if data != "":
	        f=open('requests.txt','a')
	        f.write(data+"\n\n")
	        f.close()
	        return "Thank you for the feature request."
	else:
		return "Use this command with text to request new features."

def alert(data):
	os.system("python /uas/ippower/alert.py &")
	return "Alert Sent."

def trollcall(data):
	trollface=rollcall(data)
	return trollface.replace('the space this session. ','your mom. ')	

def pronto(data):
	return "damnit pronto....."

def phone(data):
	return "Call us at 512-943-2827!"

def address(data):
	return "512 Shaw CT Suite 105, Severn MD 21144"

def update(data):
        reload(botfunc)

def command_aliaser(commandz):
        commands={}
        for k in commandz:
                for c in k.split():
                        commands[c]=commandz[k]
        return commands

commands = command_aliaser({
                'status space':status,
                'rollcall brocall':rollcall,
                'tweet twit twat':tweet,
                'site blog':site,
                'sign':sign,
                'mc':mcpipe,
                'phone':phone,
                'address':address,
                'weather':weather,
                'goingson allthethings':goingson,
                'request':request,
                'alert':alert,
                'help commands':help,
                'wiki':wiki,
                'links link':links,
                'video videos youtube':youtube,
                'nowplaying music song':nowplaying,
                'trollcall':trollcall,
                'bagels':pronto,
                })

responder_commands={'status':status,'rollcall':rollcall,'tweet':tweet,'site':site,'sign':sign,'weather':weather,'address':address}