SHOW:
|
|
- or go back to the newest paste.
| 1 | #!/usr/bin/python | |
| 2 | from ConfigParser import RawConfigParser as ConfParser | |
| 3 | from optparse import OptionParser | |
| 4 | from collections import deque | |
| 5 | from time import sleep, time, gmtime, strftime | |
| 6 | import ConfigParser | |
| 7 | import datetime | |
| 8 | import os | |
| 9 | import sys | |
| 10 | import socket | |
| 11 | import codecs | |
| 12 | from irc import * | |
| 13 | from select import select | |
| 14 | ||
| 15 | os.system('clear')
| |
| 16 | timestamp = '[' +'\x1b[32m' + datetime.datetime.now().strftime("%a %d, %H:%M:%S") + '\x1b[0m' + ']'
| |
| 17 | my = IRCbot() | |
| 18 | start = time() | |
| 19 | ||
| 20 | print('%s Starting Pybnc by Aha2Y. (Pid number: %s)' % (timestamp, os.getpid()))
| |
| 21 | try: | |
| 22 | config = ConfigParser.RawConfigParser() | |
| 23 | config.readfp(codecs.open("config.ini", "r", "utf8"))
| |
| 24 | chanQueue = deque() ; channels = [] | |
| 25 | print('%s Successfully loaded config.ini' % (timestamp))
| |
| 26 | except IOError as config: | |
| 27 | print('%s [\x1b[31mError\x1b[0m] PyZNC Can\'t read config.ini...' % (timestamp))
| |
| 28 | print('%s [\x1b[31mError\x1b[0m] Be sure you have the config file in the same dir as PyZNC is!' % (timestamp))
| |
| 29 | sys.exit() | |
| 30 | ||
| 31 | irc = socket.socket (socket.AF_INET, socket.SOCK_STREAM) | |
| 32 | bnc = socket.socket (socket.AF_INET, socket.SOCK_STREAM) | |
| 33 | print('%s Connecting to the IRC server (%s:%s)' % (timestamp, config.get('irc-connection', 'server'), config.getint('irc-connection', 'port')))
| |
| 34 | print('%s Connecting to the BNC server (%s:%s)' % (timestamp, config.get('bnc-connection', 'server'), config.getint('bnc-connection', 'port')))
| |
| 35 | irc.connect ((config.get('irc-connection', 'server'),config.getint('irc-connection', 'port')))
| |
| 36 | bnc.connect ((config.get('bnc-connection', 'server'),config.getint('bnc-connection', 'port')))
| |
| 37 | irc.send ('NICK %s\r\n' % config.get('irc-bot', 'nickname'))
| |
| 38 | bnc.send ('NICK %s\r\n' % config.get('irc-bot', 'nickname'))
| |
| 39 | irc.send ('USER %s %s pybnc :%s\r\n' % (config.get('irc-bot', 'nickname'), config.get('irc-bot', 'ident'), config.get('irc-bot', 'realname')))
| |
| 40 | bnc.send ('USER %s %s pybnc :%s\r\n' % (config.get('irc-bot', 'nickname'), config.get('irc-bot', 'ident'), config.get('irc-bot', 'realname')))
| |
| 41 | ||
| 42 | while 1: | |
| 43 | (rl, wl, xl) = select([irc, bnc], [], []) | |
| 44 | for sock in rl: | |
| 45 | data = readline(sock) | |
| 46 | raw = parse(data) | |
| 47 | if sock == bnc: | |
| 48 | if raw[0] == "PING": | |
| 49 | sock.send("PONG %s\r\n" % raw[1])
| |
| 50 | print('%s Received ping from the bnc server, Sending pong.' % timestamp)
| |
| 51 | print "[\x1b[32mbnc\x1b[0m]", raw | |
| 52 | if len(raw) > 3 and raw[3] == "*** You need to send your password. Try /quote PASS <username>:<password>": | |
| 53 | bnc.send('PASS %s \r\n' % config.get('bnc-connection', 'login'))
| |
| 54 | print('%s Bouncer Connection established.' % timestamp)
| |
| 55 | if raw[0] == "*[email protected]": | |
| 56 | if raw[1] == "PRIVMSG": | |
| 57 | if "Running for" in raw[3]: | |
| 58 | channel = chanQueue.popleft() | |
| 59 | uptime = " ".join(raw[3:]) | |
| 60 | irc.send('PRIVMSG %s :The bouncer is %s\r\n' % (channel, uptime))
| |
| 61 | if "- http://znc.in" in raw[3]: | |
| 62 | version = raw[3].strip('- http://znc.in')
| |
| 63 | if "IPv6:" in raw[3]: | |
| 64 | channel = chanQueue.popleft() | |
| 65 | version2 = " ".join(raw[3:]) | |
| 66 | irc.send('PRIVMSG %s :The bouncer is running: %s\r\n' % (channel, version))
| |
| 67 | irc.send('PRIVMSG %s :And the settings: %s\r\n' % (channel, version2))
| |
| 68 | elif sock == irc: | |
| 69 | if raw[0] == "PING": | |
| 70 | sock.send("PONG %s\r\n" % raw[1])
| |
| 71 | print('%s Received ping from the irc server, Sending pong.' % timestamp)
| |
| 72 | print "[\x1b[31mirc\x1b[0m]", raw | |
| 73 | if raw[1] == "439" and raw[3] == "Please wait while we process your connection.": | |
| 74 | my.server = raw[0] | |
| 75 | if raw[1] == "376" and raw[3] == "End of /MOTD command.": | |
| 76 | irc.send('JOIN %s \r\n' % config.get('irc-bot', 'mainchan'))
| |
| 77 | print('%s IRC Connection established.' % timestamp)
| |
| 78 | if raw[0].startswith("NickServ!"):
| |
| 79 | if raw[1] == "NOTICE" and "This nickname is registered" in raw[3]: | |
| 80 | irc.send('PRIVMSG NickServ :identify %s \r\n' % config.get('irc-bot', 'nickpass'))
| |
| 81 | if raw[1] == "PRIVMSG": | |
| 82 | my.sender = raw[0] | |
| 83 | my.nick = raw[0].split("!")[0]
| |
| 84 | my.auth = data.split('@')[0][1:]
| |
| 85 | if len(raw) > 3: | |
| 86 | if raw[3] == "!uptime": | |
| 87 | chanQueue.append(raw[2]) | |
| 88 | end = time() | |
| 89 | uptime = end - start | |
| 90 | bnc.send('PRIVMSG *status :uptime \r\n')
| |
| 91 | irc.send('PRIVMSG %s :The bot is running for %s \r\n' % (raw[2], duration_human(uptime)))
| |
| 92 | if raw[3] == "!rehash": | |
| 93 | try: | |
| 94 | if config.get('staff', my.auth) == 'admin':
| |
| 95 | chanQueue.append(raw[2]) | |
| 96 | bnc.send('PRIVMSG *status :rehash\r\n')
| |
| 97 | irc.send('PRIVMSG %s :Bouncer successfuly rehashed!\r\n' % raw[2])
| |
| 98 | except ConfigParser.NoOptionError: | |
| 99 | irc.send('PRIVMSG %s :I don\'t recognize you. \r\n' % raw[2])
| |
| 100 | if raw[3] == "!shutdown": | |
| 101 | try: | |
| 102 | if config.get('staff', my.auth) == 'admin':
| |
| 103 | chanQueue.append(raw[2]) | |
| 104 | bnc.send('PRIVMSG *status :shutdown\r\n')
| |
| 105 | except ConfigParser.NoOptionError: | |
| 106 | irc.send('PRIVMSG %s :I don\'t recognize you. \r\n' % raw[2])
| |
| 107 | if raw[3] == "!restart": | |
| 108 | try: | |
| 109 | if config.get('staff', my.auth) == 'admin':
| |
| 110 | chanQueue.append(raw[2]) | |
| 111 | bnc.send('PRIVMSG *status :reboot\r\n')
| |
| 112 | irc.send('PRIVMSG %s :Restarting server...\r\n' % raw[2])
| |
| 113 | except ConfigParser.NoOptionError: | |
| 114 | irc.send('PRIVMSG %s :I don\'t recognize you. \r\n' % raw[2])
| |
| 115 | if raw[3].startswith("!global "):
| |
| 116 | try: | |
| 117 | if config.get('staff', my.auth) == 'admin':
| |
| 118 | globalmsg = raw[3].split(" ", 1)[1]
| |
| 119 | globalmessage = " ".join(raw[3:]) | |
| 120 | bnc.send('PRIVMSG *status :broadcast %s\r\n' % globalmsg)
| |
| 121 | irc.send('PRIVMSG %s :[Global] %s\r\n' % (raw[2], globalmsg))
| |
| 122 | except ConfigParser.NoOptionError: | |
| 123 | irc.send('PRIVMSG %s :I don\'t recognize you. \r\n' % raw[2])
| |
| 124 | if raw[3] == "!version": | |
| 125 | chanQueue.append(raw[2]) | |
| 126 | bnc.send('PRIVMSG *status :version \r\n')
| |
| 127 | if raw[3] == "!help": | |
| 128 | irc.send('PRIVMSG %s :Available commands: !version, !uptime, !whoami, !rehash, !restart, !shutdown, !global\r\n' % raw[2])
| |
| 129 | if raw[3] == "!get nick": | |
| 130 | irc.send('PRIVMSG %s :%s \r\n' % (raw[2], my.nick))
| |
| 131 | if raw[3] == "!get sender": | |
| 132 | irc.send('PRIVMSG %s :%s \r\n' % (raw[2], my.sender))
| |
| 133 | if raw[3] == "!get server": | |
| 134 | irc.send('PRIVMSG %s :%s \r\n' % (raw[2], my.server))
| |
| 135 | if raw[3] == "!whoami": | |
| 136 | try: | |
| 137 | if config.get('staff', my.auth) == 'admin':
| |
| 138 | irc.send('PRIVMSG %s :You are authenticated as admin. \r\n' % raw[2])
| |
| 139 | except ConfigParser.NoOptionError: | |
| 140 | irc.send('PRIVMSG %s :I don\'t recognize you. \r\n' % raw[2]) |