Starting networks is now via command line, and parameterized

This commit is contained in:
moneromooo 2015-01-26 22:18:18 +00:00
parent 50455a0d08
commit 1d3f650bba
5 changed files with 86 additions and 21 deletions

View File

@ -22,6 +22,7 @@ import httplib
import time import time
import string import string
import importlib import importlib
import re
import tipbot.coinspecs as coinspecs import tipbot.coinspecs as coinspecs
import tipbot.config as config import tipbot.config as config
from tipbot.log import log_error, log_warn, log_info, log_log from tipbot.log import log_error, log_warn, log_info, log_log
@ -36,6 +37,7 @@ disabled = False
selected_coin = None selected_coin = None
modulenames = [] modulenames = []
start_networks = []
argc = 1 argc = 1
while argc < len(sys.argv): while argc < len(sys.argv):
arg = sys.argv[argc] arg = sys.argv[argc]
@ -60,7 +62,24 @@ while argc < len(sys.argv):
log_error('Usage: tipbot.py [-m|--module modulename]* -c|--coin <coinname>') log_error('Usage: tipbot.py [-m|--module modulename]* -c|--coin <coinname>')
exit(1) exit(1)
argc = argc+1 argc = argc+1
modulenames.append(sys.argv[argc]) arg = sys.argv[argc]
if not arg in modulenames:
modulenames.append(arg)
elif arg == "-n" or arg == "--network":
if argc+1 == len(sys.argv):
log_error('Usage: tipbot.py [-m|--module modulename]* -c|--coin <coinname>')
exit(1)
argc = argc+1
arg = sys.argv[argc]
if re.match('[^:]+:.+',arg):
parts=arg.split(':',1)
if not parts[1] in modulenames:
modulenames.append(parts[1])
start_networks.append({'name':parts[0],'type':parts[1]})
else:
if not arg in modulenames:
modulenames.append(arg)
start_networks.append({'type':arg})
elif arg == "-h" or arg == "--help": elif arg == "-h" or arg == "--help":
log_info('Usage: tipbot.py [-m|--module modulename]* -c|--coin <coinname>') log_info('Usage: tipbot.py [-m|--module modulename]* -c|--coin <coinname>')
exit(0) exit(0)
@ -361,10 +380,24 @@ MigrateRedis()
InitScanBlockHeight() InitScanBlockHeight()
# TODO: make this be created when the module is loaded # TODO: make this be created when the module is loaded
irc = sys.modules["freenode"].FreenodeNetwork() for network_setup in start_networks:
irc.set_callbacks(OnCommandProxy,OnIdentified) network_type=network_setup['type']
if irc.connect(config.irc_network,config.irc_port,config.tipbot_name,GetPassword(),config.irc_send_delay): if 'name' in network_setup:
AddNetwork(irc) network_name=network_setup['name']
log_info('Starting "%s" %s network' % (network_name, network_type))
else:
network_name=network_type
log_info('Starting %s network' % network_type)
name=network_name or network_type
try:
network=registered_networks[network_type](name=name)
network.set_callbacks(OnCommandProxy,OnIdentified)
if network.connect():
AddNetwork(network)
except Exception,e:
log_error('Error starting %s network: %s' % (name,str(e)))
exit(1)
while len(networks)>0: while len(networks)>0:
for network in networks: for network in networks:

View File

@ -18,9 +18,6 @@ irc_send_delay = 0.4
irc_welcome_line = 'Welcome to the freenode Internet Relay Chat Network' irc_welcome_line = 'Welcome to the freenode Internet Relay Chat Network'
irc_channels = ['#txtptest000'] irc_channels = ['#txtptest000']
irc_timeout_seconds = 600 irc_timeout_seconds = 600
irc_use_ssl = True
irc_use_sasl = True
irc_sasl_name = "monero-tipbot"
redis_host="127.0.0.1" redis_host="127.0.0.1"
redis_port=7777 redis_port=7777
@ -47,6 +44,18 @@ silent_invalid_commands = {
'freenode': ['price','worth','net','pools','calc'] 'freenode': ['price','worth','net','pools','calc']
} }
network_config = {
'freenode': {
'host': 'irc.freenode.net',
'port': 6697,
'login': tipbot_name,
'delay': irc_send_delay,
'ssl': True,
'sasl': True,
'sasl_name': 'monero-tipbot',
},
}
dice_min_multiplier=1.1 dice_min_multiplier=1.1
dice_max_multiplier=10 dice_max_multiplier=10
dice_edge = 0.01 dice_edge = 0.01

View File

@ -18,8 +18,8 @@ from tipbot.command_manager import *
from irc import * from irc import *
class FreenodeNetwork(IRCNetwork): class FreenodeNetwork(IRCNetwork):
def __init__(self): def __init__(self,name):
IRCNetwork.__init__(self,"freenode") IRCNetwork.__init__(self,name)
def login(self): def login(self):
self.send_to("nickserv", "IDENTIFY %s" % self.password) self.send_to("nickserv", "IDENTIFY %s" % self.password)
@ -52,3 +52,4 @@ class FreenodeNetwork(IRCNetwork):
log_error('ACC line not as expected...') log_error('ACC line not as expected...')
return True return True
RegisterNetwork("freenode",FreenodeNetwork)

View File

@ -44,7 +44,21 @@ class IRCNetwork(Network):
self.quitting = False self.quitting = False
self.buffered_data = "" self.buffered_data = ""
def connect(self,host,port,login,password,delay): def connect(self):
try:
cfg=config.network_config[self.name]
host=cfg['host']
port=cfg['port']
login=cfg['login']
password=GetPassword(self.name)
delay=cfg['delay']
self.use_ssl=cfg['ssl']
self.use_sasl=cfg['sasl']
if self.use_sasl:
self.sasl_name=cfg['sasl_name']
except Exception,e:
log_error('Configuration not found for %s: %s' % (self.name, str(e)))
return False
return self._connect(host,port,login,password,delay) return self._connect(host,port,login,password,delay)
def disconnect(self): def disconnect(self):
@ -170,7 +184,7 @@ class IRCNetwork(Network):
if data.find ( config.irc_welcome_line ) != -1: if data.find ( config.irc_welcome_line ) != -1:
self.userstable = dict() self.userstable = dict()
self.registered_users.clear() self.registered_users.clear()
if not config.irc_use_sasl: if not self.use_sasl:
self.login() self.login()
for chan in config.irc_channels: for chan in config.irc_channels:
self.join(chan) self.join(chan)
@ -182,8 +196,8 @@ class IRCNetwork(Network):
return True return True
if data.startswith('AUTHENTICATE +'): if data.startswith('AUTHENTICATE +'):
if config.irc_use_sasl: if self.use_sasl:
authstring = config.irc_sasl_name + chr(0) + config.irc_sasl_name + chr(0) + self.password authstring = self.sasl_name + chr(0) + self.sasl_name + chr(0) + self.password
self._irc_sendmsg('AUTHENTICATE %s' % base64.b64encode(authstring)) self._irc_sendmsg('AUTHENTICATE %s' % base64.b64encode(authstring))
else: else:
log_warn('Got AUTHENTICATE while not using SASL') log_warn('Got AUTHENTICATE while not using SASL')
@ -370,13 +384,13 @@ class IRCNetwork(Network):
log("IRCSEND",msg) log("IRCSEND",msg)
def _irc_recv(self,size,flags=None): def _irc_recv(self,size,flags=None):
if config.irc_use_ssl: if self.use_ssl:
return self.sslirc.read(size) return self.sslirc.read(size)
else: else:
return self.irc.recv(size,flags) return self.irc.recv(size,flags)
def _irc_send(self,data): def _irc_send(self,data):
if config.irc_use_ssl: if self.use_ssl:
return self.sslirc.write(data) return self.sslirc.write(data)
else: else:
return self.irc.send(data) return self.irc.send(data)
@ -447,7 +461,7 @@ class IRCNetwork(Network):
self.registered_users=set() self.registered_users=set()
try: try:
self.irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM ) self.irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
if config.irc_use_ssl: if self.use_ssl:
try: try:
raise RuntimeError('') raise RuntimeError('')
self.irc_ssl_context = ssl.create_default_context() self.irc_ssl_context = ssl.create_default_context()
@ -461,7 +475,7 @@ class IRCNetwork(Network):
log_error( 'Error initializing IRC: %s' % str(e)) log_error( 'Error initializing IRC: %s' % str(e))
return False return False
self._log_IRCRECV(self._irc_recv(4096)) self._log_IRCRECV(self._irc_recv(4096))
if config.irc_use_sasl: if self.use_sasl:
self._irc_sendmsg('CAP REQ :sasl') self._irc_sendmsg('CAP REQ :sasl')
else: else:
self._irc_sendmsg ( 'PASS *********') self._irc_sendmsg ( 'PASS *********')
@ -518,3 +532,4 @@ RegisterCommand({
'admin': True, 'admin': True,
'help': "Makes %s part from a channel" % (config.tipbot_name) 'help': "Makes %s part from a channel" % (config.tipbot_name)
}) })
RegisterNetwork("irc",IRCNetwork)

View File

@ -19,22 +19,26 @@ import tipbot.coinspecs as coinspecs
from tipbot.log import log_error, log_warn, log_info, log_log from tipbot.log import log_error, log_warn, log_info, log_log
from tipbot.redisdb import * from tipbot.redisdb import *
registered_networks=dict()
networks=[] networks=[]
cached_tipbot_balance=None cached_tipbot_balance=None
cached_tipbot_unlocked_balance=None cached_tipbot_unlocked_balance=None
cached_tipbot_balance_timestamp=None cached_tipbot_balance_timestamp=None
def GetPassword(): def GetPassword(name):
try: try:
f = open('tipbot-password.txt', 'r') f = open('tipbot-password.txt', 'r')
for p in f: for p in f:
p = p.strip("\r\n") p = p.strip("\r\n")
f.close() parts=p.split(':')
return p if parts[0]==name:
return parts[1]
except Exception,e: except Exception,e:
log_error('could not fetch password: %s' % str(e)) log_error('could not fetch password: %s' % str(e))
raise raise
return "xxx" return "xxx"
finally:
f.close()
def IsParamPresent(parms,idx): def IsParamPresent(parms,idx):
return len(parms) > idx return len(parms) > idx
@ -243,6 +247,9 @@ def IdentityFromString(link,s):
def NickFromIdentity(identity): def NickFromIdentity(identity):
return identity.split(':')[1] return identity.split(':')[1]
def RegisterNetwork(name,type):
registered_networks[name]=type
def AddNetwork(network): def AddNetwork(network):
networks.append(network) networks.append(network)