Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- import socket, string, ssl, time, os, random, hashlib, base64, urllib2, threading, re
- wait = []
- wait2 = []
- kicks = []
- sock_lock = threading.Lock()
- # Some functions
- # Ping
- def ping():
- s.send("PONG %s\n" % buffer.split(" ")[1])
- print "<< PONG %s" % buffer.split(" ")[1]
- # Split message
- def make():
- try:
- msg = buffer.split(":")
- m_nick = msg[1].split(" ")[0].split("!")[0]
- m_chan = msg[1].split(" ")[2]
- msg = ":".join(map(str,msg[2:]))
- return (msg,m_nick,m_chan)
- except:
- none = False
- return ("","","")
- # Send message
- def say(c,m):
- for n in range(len(notnice)):
- m = m.replace(notnice[n],nice[n])
- s.send("PRIVMSG %s :%s\n" % (c,m))
- print "<< PRIVMSG %s :%s" % (c,m)
- # Send notice
- def notice(n,m):
- s.send("NOTICE %s :%s\n" % (n,m))
- print "<< NOTICE %s :%s" % (n,m)
- # Wait system
- def add(u,c):
- wait.append((u,c,time.time()))
- def add2(u,c):
- wait2.append((u,c,time.time()))
- def check(u,c, SAY = True):
- count = 0
- count2 = 0
- for i in wait:
- if i[0] == u and time.time() - i[2] < 30 and i[1] == c and u not in adminlist:
- count += 1
- if i[0] == u and time.time() - i[2] < 180 and i[1] == c and u not in adminlist:
- count2 += 1
- if count == 3 or count2 == 10:
- if u in ignorelist:
- return False
- if SAY:
- say(c,"%s, Please wait a while" % u)
- add(u,c)
- return False
- elif count > 3 or count2 > 10:
- return False
- else:
- if u in ignorelist:
- return False
- else:
- return True
- def check2(u,c):
- count = 0
- count2 = 0
- for i in wait2:
- if i[0] == u and time.time() - i[2] < 7 and i[1] == c and u not in adminlist:
- count += 1
- if i[0] == u and time.time() - i[2] < 5 and i[1] == c and u not in adminlist:
- count2 += 1
- if count >= 10:
- s.send("KICK %s %s :Anti spamming\n" % (c,u))
- print "<< KICK %s %s :Anti spamming" % (c,u)
- if count >= 6:
- s.send("KICK %s %s :Anti spamming\n" % (c,u))
- print "<< KICK %s %s :Anti spamming" % (c,u)
- # Rejoin
- def rejoin(m):
- try:
- mkick = m.split(":")
- k_nick = mkick[1].split(" ")[0].split("!")[0]
- k_chan = mkick[1].split(" ")[2]
- if mkick[1].split(" ")[1] == "KICK" and mkick[1].split(" ")[3] == "Qbot":
- ret = True
- for k in kicks:
- if k[0] == k_chan and time.time() - k[1] < 45:
- ret = False
- if k_nick == "rChanBot":
- time.sleep(5)
- s.send("JOIN %s\n" % k_chan)
- print "<< JOIN %s" % k_chan
- elif ret:
- time.sleep(5)
- s.send("JOIN %s\n" % k_chan)
- print "<< JOIN %s" % k_chan
- kicks.append([k_chan,time.time()])
- say(k_chan, k_nick + ", I'm just a bot with autorejoin. Please don't ban me. If you kick me again in 30 seconds, I won't bother you anymore")
- except:
- print "Hasn't been kicked"
- print 8
- return
- def rejoin60(c):
- time.sleep(60)
- s.send("JOIN %s\n" % c)
- print "<< JOIN %s" % c
- return
- # Clear requests & channel
- def clear_req():
- while 1:
- if len(wait) > 0:
- for i in wait:
- if time.time() - i[2] > 240:
- del wait[wait.index(i)]
- time.sleep(20)
- def clear_chan():
- while 1:
- if len(wait2) > 0:
- for i in wait2:
- if time.time() - i[2] > 15:
- del wait2[wait2.index(i)]
- time.sleep(5)
- # Update ignore list
- def update_ignore():
- f = open("ignorelist.dat","w")
- for i in ignorelist:
- if i != "":
- if i != ignorelist[-1]:
- f.write(i + "\n")
- else:
- f.write(i)
- f.close()
- # Get link title
- def link_title(link,c):
- try:
- req = urllib2.Request(link)
- req.add_header("User-Agent","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)")
- page = urllib2.urlopen(req).read().replace("\n","").replace("\r","").replace("\t","")
- #r = re.findall("<title>[\W]*(.+)[\W]*</title>",page,re.I)
- page = re.sub("<title (.+)>","<title>",page,re.I)
- page = page[(page.find("<title>") + 7):(page.find("</title>"))]
- r = re.sub("[ ]{2,}"," ",page).strip(" ")
- if len(r) > 0:
- if len(r) <= 30:
- say(c, link + " -> " + r)
- else:
- r2 = r.split(" ")
- r3 = ""
- for i in range(len(r2)):
- if len(r3 + " " + r2[i]) < 30:
- r3 += " " + r2[i]
- else:
- break
- if r3 == "":
- r = r[:30]
- else:
- r = r3
- r += "..."
- say(c, link + " -> " + r)
- else:
- say(c, "Error while getting title, maybe 404")
- except:
- say(c, "Error while getting page, maybe wrong server?")
- return
- if __name__ == "__main__":
- # Variable Definitions
- host = "irc.land.yt"
- port = 6667
- nick = "IssacBot"
- username = "IssacBot"
- realname = "IssacBotBot"
- channels = "#lizardlounge"
- buffer = ""
- msg = ""
- m_nick = ""
- m_chan = ""
- conn = False
- help = "$say, $help, $credits, $joke, $hash, $b64en, $b64de, $urlen, $urlde, [$search|$s], [$link|$l]"
- admin_help = "$join, $leave, $restart, $welcome, $ignore, $chansay"
- antispamchans = ["#sd","#linux"]
- notnice = ["retard","gay","הומו","כוסעמק","גיי ","בן זונה","מוצצת","כוסאמא","זונה","סעמק","זין","אידיוט","מפגר","מטומטם","motherfucker","בןזונה","בנזונה","fag","fuck","retart","faggot","bitch","nigger","bastard","g a y","b i t c h","f u c k","r e t a r d","b a s t a r d","n i g g e r","כוס עמק","ינעל","STFU","גייז ","זונות"]
- nice = ["r*tard","g*y","ה*מו","כ*סעמק","ג*י ","בן ז*נה","מו**ת","כ*סאמא","ז*נה","ס*מק","ז*ן","אחד*ןו","מפ*ר","מטומ*ם","motherf*cker","בןז*נה","בנז*נה","f*g","f*ck","rest*rt","f*ggot","b*tch","n*gger","b*stard", "g * y","b * t c h","f * c k","r * t a r d","b * s t a r d","n * g g e r","כ*ס עמק","ינ*ל","ST*U","גי*ז ","ז*נות"]
- logchans = ["#security"]
- adminlist = ("Qazjap11","Q11","Q[BRB]")
- #f = open("ignorelist.dat","r")
- #ignorelist = f.readlines()
- #f.close()
- #for i in ignorelist:
- #if i == "":
- #del ignorelist[ignorelist.index(i)]
- #if i[-1] == '\n':
- #ignorelist[ignorelist.index(i)] = i[:-1]
- # Load Jokes
- #randj = random.randint(1,130)
- #f = open("jokes/jokes-" + str(randj) + ".dat")
- #jokes = f.readlines()
- #f.close()
- #print "Jokes #%d loaded!" % randj
- # Connecting
- while not conn:
- try:
- print "Connecting %s:%d..." % (host,port)
- sa = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sa.connect((host,port))
- s = ssl.wrap_socket(sa)
- conn = True
- except:
- try:
- s.close()
- sa.close()
- except:
- print "No connection..."
- print "Connection errors"
- conn = False
- time.sleep(3)
- print "Connected %s:%d!" % (host,port)
- # Join
- s.send("USER %s %s bla :%s\n" % (username,host,realname))
- print "<< USER %s %s bla :%s" % (username,host,realname)
- s.send("NICK %s\n" % nick)
- print "<< NICK %s" % nick
- buffer = s.recv(4096)
- if buffer.find("PING :") != -1:
- print ">> " + buffer
- ping()
- else:
- print "Didn't recieve ping"
- s.send("PRIVMSG NICKSERV :IDENTIFY **********\n")
- print "<< PRIVMSG NICKSERV :IDENTIFY **********"
- time.sleep(2)
- s.send("JOIN %s\n" % channels)
- print "<< JOIN %s" % channels
- t = threading.Thread(target=clear_req)
- t.start()
- t = threading.Thread(target=clear_chan)
- t.start()
- # Gratz
- #s.send("PRIVMSG %s :%s\n" % (channels, "Hi! I'm Q11's bot! Type $help to see my commands"))
- #print "<< PRIVMSG %s :%s" % (channels, "Hi! I'm Q11's bot! Type $help to see my commands")
- # Listen
- while 1:
- try:
- buffer = s.recv(4096)
- buffer = buffer.strip('\n\r')
- (msg,m_nick,m_chan) = make()
- smsg = msg.split(" ")
- if buffer != "":
- print ">> " + buffer
- except KeyboardInterrupt:
- s.send("QUIT :Qbot\n")
- print "<< QUIT :Qbot"
- exit()
- # Reply pings
- if buffer.find("PING :") != -1:
- ping()
- # Anti spamming mode
- if m_chan in antispamchans:
- add2(m_nick,m_chan)
- check2(m_nick,m_chan)
- # Commands
- if msg == "$say":
- if check(m_nick, m_chan):
- say(m_chan, "Hi! I'm Q11's bot! Type $help to see my commands")
- add(m_nick, m_chan)
- if msg == "$credits":
- if check(m_nick, m_chan):
- notice(m_nick, "Bot by Qazjap11!")
- add(m_nick, m_chan)
- if msg == "$help" and m_nick not in adminlist:
- if check(m_nick, m_chan):
- notice(m_nick, help)
- add(m_nick, m_chan)
- if msg == "$help" and m_nick in adminlist:
- notice(m_nick, help + ", " + admin_help)
- if smsg[0] == "$say" and len(smsg) > 1 and smsg[1] != "":
- tmp = smsg[1:]
- if check(m_nick, m_chan):
- say(m_chan, " ".join(map(str,tmp)))
- add(m_nick, m_chan)
- if smsg[0] == "$chansay" and len(smsg) > 2 and smsg[1] != "" and smsg[2] != "" and m_nick in adminlist:
- tmp = smsg[2:]
- say(smsg[1], " ".join(map(str,tmp)))
- if smsg[0] == "$b64en" and len(smsg) > 1 and smsg[1] != "":
- tmp = smsg[1:]
- tmp = " ".join(map(str,tmp))
- if check(m_nick, m_chan):
- say(m_chan, "base64_encode('" + tmp + "') = " + base64.b64encode(tmp))
- add(m_nick, m_chan)
- if smsg[0] == "$b64de" and len(smsg) == 2 and smsg[1] != "":
- if check(m_nick, m_chan):
- try:
- say(m_chan, "base64_decode('" + smsg[1] + "') = " + base64.b64decode(smsg[1]))
- except:
- say(m_chan, "Invalid message")
- add(m_nick, m_chan)
- if smsg[0] == "$urlen" and len(smsg) > 1 and smsg[1] != "":
- tmp = smsg[1:]
- tmp = " ".join(map(str,tmp))
- if check(m_nick, m_chan):
- say(m_chan, urllib2.quote(tmp))
- add(m_nick, m_chan)
- if smsg[0] == "$urlde" and len(smsg) == 2 and smsg[1] != "":
- if check(m_nick, m_chan):
- say(m_chan, urllib2.unquote(smsg[1]))
- add(m_nick, m_chan)
- if (smsg[0] == "$link" or smsg[0] == "$l") and len(smsg) >= 2 and smsg[1] != "" and re.search("^(http|https)://(www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,4}(\.[a-zA-Z]{2,4})?(:[\d]{1,5})?(.*)$",smsg[1]):
- if check(m_nick, m_chan):
- t = threading.Thread(target=link_title,args=(smsg[1],m_chan))
- t.start()
- add(m_nick, m_chan)
- if (smsg[0] == "$link" or smsg[0] == "$l") and (len(smsg) < 2 or not re.search("^(http|https)://(www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,4}(\.[a-zA-Z]{2,4})?(:[\d]{1,5})?(.*)$",smsg[1])):
- if check(m_nick, m_chan):
- say(m_chan, "Usage: [$l|$link] URL")
- add(m_nick, m_chan)
- if smsg[0] == "$join" and len (smsg) == 2 and m_nick in adminlist:
- s.send("JOIN %s\n" % smsg[1])
- print "<< JOIN %s" % smsg[1]
- if msg == "$leave" and m_nick in adminlist:
- s.send("PART %s\n" % m_chan)
- print "<< PART %s" % m_chan
- if smsg[0] == "$leave" and len (smsg) == 2 and m_nick in adminlist:
- s.send("PART %s\n" % smsg[1])
- print "<< PART %s" % smsg[1]
- if smsg[0] == "$welcome" and len (smsg) >= 2 and m_nick in adminlist:
- notice(smsg[1], "Hi " + smsg[1] + "! I'm Q11's bot! Type $help to see my commands")
- if msg == "$restart" and m_nick in adminlist:
- s.send("QUIT :Restarting\n")
- print "<< QUIT :Restarting"
- os.system("killall -9 python && ./irc.py")
- exit()
- if smsg[0] == "$ignore" and len (smsg) > 1 and m_nick in adminlist:
- if smsg[1] == "add":
- if smsg[2] in ignorelist:
- notice(m_nick, smsg[2] + " is already in ignore list")
- else:
- ignorelist.append(smsg[2])
- update_ignore()
- notice(m_nick, smsg[2] + " added to ignore list")
- elif smsg[1] == "remove":
- if smsg[2] not in ignorelist:
- notice(m_nick, smsg[2] + " is not in ignore list")
- else:
- del ignorelist[ignorelist.index(smsg[2])]
- update_ignore()
- notice(m_nick, smsg[2] + " removed from ignore list")
- elif smsg[1] == "list":
- for i in ignorelist:
- if i != ignorelist[0]:
- ms += ", " + i
- else:
- ms = i
- notice(m_nick, "Ignore list: " + ms)
- else:
- notice(m_nick, "Usage: $ignore [add|remove|list] [nick]")
- if smsg[0] == "$ignore" and len (smsg) == 1 and m_nick in adminlist:
- notice(m_nick, "Usage: $ignore [add|remove|list] [nick]")
- if msg == "$joke":
- if check(m_nick, m_chan):
- joke = random.choice(jokes)
- if len(joke) < 450:
- say(m_chan, joke)
- else:
- joke2 = joke.split(" ")
- joke = ""
- for i in range(len(joke2)):
- if len(joke + " " + joke2[i]) < 450:
- joke += " " + joke2[i]
- else:
- break
- say(m_chan, joke)
- say(m_chan, " ".join(map(str,joke2[i:])))
- add(m_nick, m_chan)
- if smsg[0] == "$hash":
- if check(m_nick, m_chan):
- if len(smsg) > 2:
- tmp = smsg[2:]
- tmp = " ".join(map(str,tmp))
- if len(tmp) > 32:
- say(m_chan,"Message must be below 32 char long")
- else:
- if smsg[1] == "md5":
- m = hashlib.md5()
- m.update(tmp)
- say(m_chan, "md5('" + tmp + "') = " + m.hexdigest())
- elif smsg[1] == "sha1":
- m = hashlib.sha1()
- m.update(tmp)
- say(m_chan, "sha1('" + tmp + "') = " + m.hexdigest())
- elif smsg[1] == "sha224":
- m = hashlib.sha224()
- m.update(tmp)
- say(m_chan, "sha224('" + tmp + "') = " + m.hexdigest())
- elif smsg[1] == "sha384":
- m = hashlib.sha384()
- m.update(tmp)
- say(m_chan, "sha384('" + tmp + "') = " + m.hexdigest())
- elif smsg[1] == "sha512":
- m = hashlib.sha512()
- m.update(tmp)
- say(m_chan, "sha512('" + tmp + "') = " + m.hexdigest())
- else:
- say(m_chan, "Usage: $hash [md5|sha1|sha224|sha384|sha512] message")
- else:
- say(m_chan, "Usage: $hash [md5|sha1|sha224|sha384|sha512] message")
- add(m_nick, m_chan)
- if (smsg[0] == "$search" or smsg[0] == "$s") and len(smsg) > 1:
- if check(m_nick, m_chan):
- if m_chan in logchans:
- tmp = smsg[1:]
- tmp = " ".join(map(str,tmp))
- logs = os.popen("tail -n 200 ~/.xchat2/xchatlogs/Nix-" + m_chan + ".log | grep \\<.*\\>").read()
- logs = logs.split("\n")
- logs_fin = []
- for log in logs:
- if log.find(tmp) != -1:
- logs_fin.append(log)
- if len(logs_fin) > 4:
- logs_fin = logs_fin[-4:-1]
- else:
- logs_fin = logs_fin[:-1]
- if len(logs_fin) > 0:
- for log in logs_fin:
- say(m_chan, log)
- else:
- say(m_chan, "%s, No matches found in last 200 lines" % m_nick)
- else:
- say(m_chan, "Log search isn't available in this channel");
- add(m_nick, m_chan)
- #for m in notnice:
- # if msg.lower().find(m.lower()) != -1:
- # if check(m_nick, m_chan, False):
- # say(m_chan, "%s, לא יפה לקלל" % m_nick);
- # add(m_nick, m_chan)
- # break
- if buffer.find("KICK") != -1:
- t = threading.Thread(target=rejoin,args=(buffer,))
- t.start()
- if buffer.find("500") != -1:
- try:
- m_rejoin = buffer.split(":")
- if m_rejoin[1].split(" ")[0] == "maia.nix.co.il" and m_rejoin[1].split(" ")[1] == "500" and m_rejoin[1].split(" ")[2] == "Qbot":
- t = threading.Thread(target=rejoin60,args=(m_rejoin[1].split(" ")[3],))
- t.start()
- except:
- print "No rejoin"
Add Comment
Please, Sign In to add comment