2013-12-22 01:03:18 +01:00
# Import some necessary libraries.
import socket
import time
2013-12-22 02:53:58 +01:00
import Queue
2013-12-22 04:31:39 +01:00
import random
2013-12-22 02:53:58 +01:00
from threading import Thread
2013-12-22 01:03:18 +01:00
# Some basic variables used to configure the bot
server = " irc.freenode.net " # Server
channel = " #openscienceframework " # Channel
botnick = " ShaunaBot " # Your bots nick
2013-12-22 02:53:58 +01:00
# Connects to server and joins channel
2013-12-22 01:03:18 +01:00
ircsock = socket . socket ( socket . AF_INET , socket . SOCK_STREAM )
ircsock . connect ( ( server , 6667 ) ) # Here we connect to the server using the port 6667
ircsock . send ( " USER " + botnick + " " + botnick + " " + botnick + " :This bot is a result of a tutoral covered on http://shellium.org/wiki. \n " ) # user authentication
ircsock . send ( " NICK " + botnick + " \n " ) # here we actually assign the nick to the bot
2013-12-22 02:53:58 +01:00
def joinchan ( chan ) : # This function is used to join channels.
2013-12-22 17:47:38 +01:00
ircsock . send ( " JOIN " + chan + " \n " )
2013-12-22 02:53:58 +01:00
2013-12-22 03:38:29 +01:00
joinchan ( channel )
2013-12-22 01:03:18 +01:00
2013-12-22 02:53:58 +01:00
# Creates separate thread for reading messages from the server
def getIRC ( ) :
2013-12-22 17:47:38 +01:00
while True :
ircmsg = ircsock . recv ( 2048 ) # receive data from the server
ircmsg = ircmsg . strip ( ' \n \r ' ) # removing any unnecessary linebreaks.
q . put ( ircmsg ) # Put in queue for main loop to read
print ( ircmsg )
2013-12-22 02:53:58 +01:00
q = Queue . LifoQueue ( )
t = Thread ( target = getIRC )
t . daemon = True
t . start ( )
# Classes
2013-12-22 01:03:18 +01:00
class newcomer ( object ) : # Newcomer class created when someone joins the room
2013-12-22 17:47:38 +01:00
def __init__ ( self , nick ) :
self . nick = nick
self . born = time . time ( )
self . status = 0
2013-12-22 01:03:18 +01:00
2013-12-22 17:47:38 +01:00
def changeStatus ( self , status ) :
self . status = status # Right now there's just status 0 (not replied to) and 1 (replied to)
2013-12-22 01:03:18 +01:00
2013-12-22 17:47:38 +01:00
def aroundFor ( self ) :
return time . time ( ) - self . born
2013-12-22 02:53:58 +01:00
# Functions
def ping ( ) : # Responds to server Pings.
2013-12-22 17:47:38 +01:00
ircsock . send ( " PONG :pingis \n " )
2013-12-22 01:03:18 +01:00
2013-12-22 04:31:39 +01:00
def hello ( speaker , greeting ) : # This function responds to a user that inputs "Hello Mybot"
2013-12-22 17:47:38 +01:00
ircsock . send ( " PRIVMSG " + channel + " : " + greeting + " " + speaker + " \n " )
2013-12-22 01:03:18 +01:00
2013-12-22 04:31:39 +01:00
def help ( speaker ) : # This function explains what the bot is when queried.
2013-12-22 17:47:38 +01:00
ircsock . send ( " PRIVMSG " + channel + " :I ' m a bot! I ' m from here: https://github.com/shaunagm/oh-irc-bot. You can change my behavior by submitting a pull request or by talking to shauna. \n " )
2013-12-22 04:31:39 +01:00
def welcome ( newcomer ) : # This welcomes a specific person.
2013-12-22 17:47:38 +01:00
ircsock . send ( " PRIVMSG " + channel + " :Welcome " + newcomer + " ! \n " )
ircsock . send ( " PRIVMSG " + channel + " :(pssst shauna there ' s someone here) \n " )
2013-12-22 01:03:18 +01:00
2013-12-22 02:53:58 +01:00
#### Main function
2013-12-22 01:03:18 +01:00
2013-12-22 02:53:58 +01:00
newList = [ ]
2013-12-22 17:47:38 +01:00
helloArray = [ ' Hello ' , ' hello ' , ' Hi ' , ' hi ' , ' Hey ' , ' hey ' , ' Yo ' , ' yo ' , ' Sup ' , ' sup ' ]
helpArray = [ ' Help ' , ' help ' , ' Info ' , ' info ' , ' faq ' , ' FAQ ' , ' explain yourself ' , ' EXPLAIN YOURSELF ' ]
2013-12-22 01:03:18 +01:00
2013-12-22 02:53:58 +01:00
while 1 :
2013-12-22 01:03:18 +01:00
2013-12-22 17:47:38 +01:00
for i in newList :
if i . aroundFor ( ) > 5 and i . status == 0 :
print welcome ( i . nick )
i . changeStatus ( 2 )
if q . empty ( ) == 0 :
ircmsg = q . get ( )
speaker = ircmsg . split ( " : " ) [ 1 ] . split ( " ! " ) [ 0 ]
if ircmsg . find ( " PRIVMSG " + channel ) != - 1 : # If someone has spoken into the channel
for i in newList :
if speaker != i . nick : # Don't turn off response if the person speaking is the person who joined.
i . changeStatus ( 1 ) # set status to "someone has spoken in channel" for all waiting newcomers
if ircmsg . find ( botnick ) != - 1 and ircmsg . find ( " PRIVMSG # " ) != - 1 : # If someone talks to (or refers to) the bot
if any ( x in ircmsg for x in helloArray ) :
hello ( speaker , random . choice ( helloArray ) )
if any ( y in ircmsg for y in helpArray ) :
help ( speaker )
if ircmsg . find ( " PING : " ) != - 1 : # if the server pings us then we've got to respond!
ping ( )
if ircmsg . find ( " JOIN " + channel ) != - 1 : # If someone joins #channel
if speaker != botnick : # Probably a cleaner way to do this
newList . append ( newcomer ( speaker ) ) # Create a newcomer object and append to list.
2013-12-22 01:03:18 +01:00