def irctest(): client = irc.client.IRC() server = client.server().connect("127.0.0.1", 6667, "netsink") server.join("#testchan", key="12345") server.privmsg("#testchan", "ready for tasking") # drain response messages for _ in range(6): client.process_once(0.015) server.close()
def test_irc(): server = SocketServer.TCPServer(('', 0), ircserver.IRCHandler) server.cfg = ModuleConfig('irc.conf').cfg thread.start_new_thread(server.serve_forever, ()) client = irc.client.IRC() conn = client.server().connect('127.0.0.1', server.socket.getsockname()[1], 'nickname') conn.join("#testchan", key="12345") conn.privmsg("#testchan", "ready for tasking") # drain response messages for _ in range(6): client.process_once(0.015) conn.close()
def send_message(args): client = irc.client.IRC() try: c = client.server().connect(args["server"], args["port"], args["nickname"]) except irc.client.ServerConnectionError: print(sys.exc_info()[1]) return False cc = ConnectionCallbacks(args["target"], args["message"]) c.add_global_handler("welcome", cc.on_connect) c.add_global_handler("disconnect", cc.on_disconnect) while cc.state != "Disconnected": client.process_once(0.2)
def main(channel=None, caller=None): """ Main procedure. """ # pylint: disable=R0914,R0912,W0603 # Too many local variables # Too many branches # Using the global statement from x84.bbs import getsession, getterminal, getch, echo, ini import irc.client import irc.logging session, term = getsession(), getterminal() EXIT = False if channel is None: try: channel = ini.CFG.get('irc', 'channel') except: channel = '#1984' nick = session.handle.replace(' ', '_') if nick == 'anonymous': # anonymous is heavily used, make up a new one nick = 'anon{0:03d}'.format(random.randrange(999)) if not channel[0] in '#!': channel = '#' + channel try: host = ini.CFG.get('irc', 'server') except: host = 'irc.efnet.org' try: port = ini.CFG.getint('irc', 'port') except: port = 6667 try: host_ssl = ini.CFG.getboolean('irc', 'ssl') except: host_ssl = False try: swag = ini.CFG.get('irc', 'swag') except: swag = 'x/84 BBS %s' % ini.CFG.get('system', 'bbsname') def refresh(pager, ipb, init=False): """ Returns terminal sequence suitable for refreshing screen. """ session.activity = 'Chatting in %s' % channel pager.move_end() return u''.join(( u''.join((u'\r\n', term.clear_eol, u'\r\n', term.clear_eol, term.bright_blue(u' mULTi USER nOTEPAD!'.center(term.width).rstrip()), term.clear_eol, (u'\r\n' + term.clear_eol) * (pager.height + 2), pager.border())) if init else u'', pager.title(u''.join(( term.reset, term.blue(u'-[ '), term.bold_blue(channel), term.blue(u' ]-'),))), pager.refresh(), ipb.refresh(),)) def format_server(mesg): return u''.join(( term.green('-'), term.bold_green('!'), term.green('- '), term.white(mesg), )) def format_chat(nick, target, mesg): return u''.join(( term.bold_blue('<'), term.bold_white(nick), term.bold_blue('> '), term.white(mesg), )) def format_join(nick, chan): return u''.join(( term.green('>'), term.bold_green('>'), term.green('> '), term.bold_white(nick), term.white(' joined '), term.bold_white(chan), )) def format_me(nick, target, mesg): return u''.join(( term.bold_blue('* '), term.bold_white(nick), ' ', term.white(mesg), )) def format_quit(nick, mesg): return u''.join(( term.green('<'), term.bold_green('<'), term.green('< '), term.bold_white(nick), term.white(' quit '), term.bold_black('['), term.white(mesg or 'bye'), term.bold_black(']'), )) def show_help(): return u'\r\n'.join(( term.bold_yellow('/help ') + term.white('shows this help'), term.bold_yellow('/me ') + term.white('to send an action'), term.bold_yellow('/topic ') + term.white('to see/set the topic'), term.bold_yellow('/quit ') + term.white('to quit the chat'), )) pager = get_pager(None) # output window readline = get_inputbar(pager) # input bar echo(refresh(pager, readline, init=True)) echo(pager.append(format_server(u''.join(( term.white('use '), term.bold_white('/quit'), term.white(' to exit'), ))))) dirty = time.time() def on_ctcp(c, event): if event.arguments[0] == 'ACTION': pager.append(format_me( event.source.nick, event.target, event.arguments[1], )) c.dirty = time.time() def on_connect(sock): pager.append(format_server('connected')) dirty = time.time() def on_currenttopic(c, event): nick = event.source.nick chan, topic = event.arguments pager.append(format_server(u''.join(( term.bold_white(nick), term.white(' set '), term.bold_white(chan), term.white(' topic to: '), term.bold_white(topic), )))) c.dirty = time.time() def on_erroneusnickname(c, event): pager.append(format_server('dude, that nick is not valid')) def on_error(c, event): pager.append(format_server('error: %s' % event.target)) c.dirty = time.time() c.available = False def on_welcome(c, event): pager.append(format_server(u''.join(( term.white('ready, logged in as '), term.bold_yellow(c.get_nickname()), term.white(' (use '), term.bold_white('/nick'), term.white(' to change)'), )))) pager.append(format_server('joining %s' % channel)) c.join(channel) c.dirty = time.time() def on_disconnect(c, event=None): global dirty pager.append(format_server('disconnected')) c.dirty = time.time() c.available = False def on_endofnames(c, event): pager.append(format_server('%s end of names list' % event.arguments[0])) c.dirty = time.time() def on_join(c, event): global dirty chan = event.target nick = event.source.nick pager.append(format_join(nick, chan)) c.dirty = time.time() def on_namreply(c, event): nicks = [] for nick in event.arguments[2].split(): if nick[0] in '@+%!': nicks.append(term.bold_red(nick[0]) + term.bold_white('%-9s' % nick[1:])) else: nicks.append(term.bold_white('%-9s' % nick)) pager.append(format_server('%s %s' % (event.arguments[1], u' '.join(nicks)))) c.dirty = time.time() def on_nick(c, event): pager.append(format_server(u''.join(( term.bold_white(event.source.nick), term.white(' is now known as '), term.bold_white(event.target), )))) c.dirty = time.time() def on_nicknameinuse(c, event): server.nickname += '_' pager.append(format_server(u''.join(( term.white('handle in use, trying '), term.bold_yellow(server.nickname), )))) server.nick(server.nickname) c.dirty = time.time() def on_topic(c, event): nick = event.source.nick chan = event.target topic = event.arguments[0] pager.append(format_server(u''.join(( term.bold_white(nick), term.white(' set '), term.bold_white(chan), term.white(' topic to: '), term.bold_white(topic), )))) c.dirty = time.time() def on_pubmsg(c, event): global dirty pager.append(format_chat( event.source.nick, event.target, ' '.join(event.arguments) )) c.dirty = time.time() def on_part(c, event): pager.append(format_quit(event.source.nick, event.arguments[0])) c.dirty = time.time() def on_quit(c, event): pager.append(format_quit(event.source.nick, event.arguments[0])) c.dirty = time.time() if host_ssl: import ssl factory = irc.connection.Factory(wrapper=ssl.wrap_socket) else: factory = irc.connection.Factory() client = irc.client.IRC( on_connect=on_connect, on_disconnect=on_disconnect, ) server = client.server() server.dirty = None server.available = True server.add_global_handler('ctcp', on_ctcp) server.add_global_handler('currenttopic', on_currenttopic) server.add_global_handler('endofnames', on_endofnames) server.add_global_handler('erroneusnickname', on_erroneusnickname) server.add_global_handler('error', on_error) server.add_global_handler('join', on_join) server.add_global_handler('namreply', on_namreply) server.add_global_handler('nicknameinuse', on_nicknameinuse) server.add_global_handler('nick', on_nick) server.add_global_handler('part', on_part) server.add_global_handler('pubmsg', on_pubmsg) server.add_global_handler('quit', on_quit) server.add_global_handler('topic', on_topic) server.add_global_handler('welcome', on_welcome) echo(pager.append(format_server(u''.join(( term.white('connecting to '), term.bold_white(host), ))))) server.connect( host, port, nick, ircname=swag, connect_factory=factory, ) def process_cmd(pager, msg): """ Process command recieved and display result in chat window. """ cmd, args = msg.split()[0], msg.split()[1:] # pylint: disable=W0603 # Using the global statement global CHANNEL, NICKS, EXIT if cmd.lower() == '/help': pager.append(show_help()) return True elif cmd.lower() in ('/act', '/me',): server.ctcp('action', channel, ' '.join(args)) pager.append(format_me(server.nickname, channel, ' '.join(args))) server.dirty = time.time() elif cmd.lower() in ('/names', '/users', '/who'): server.names(channel) elif cmd.lower() == '/nick': if args: server.nickname = ' '.join(args) server.nick(server.nickname) elif cmd.lower() == '/say': server.privmsg(channel, ' '.join(args)) pager.append(format_chat(server.nickname, channel, ' '.join(args))) server.dirty = time.time() elif cmd.lower() == '/topic': if args: server.topic(channel, ' '.join(args)) else: server.topic(channel) elif cmd.lower() == '/quit': EXIT = True server.quit(' '.join(args)) elif cmd.lower() == '/users': queue.put('NAMES %s' % CHANNEL) return True else: pager.append(format_server(u''.join(( term.bold_red('syntax error '), term.white('do you need /help ?'), )))) return False while not EXIT and server.available: inp = getch(POLL_KEY) # poll for and process screen resize if session.poll_event('refresh') or ( inp in (term.KEY_REFRESH, unichr(12))): pager = get_pager(pager) saved_inp = readline.content readline = get_inputbar(pager) readline.content = saved_inp echo(refresh(pager, readline, init=True)) dirty = None # process keystroke as input, or, failing that, # as a command key to the pager. refresh portions of # input bar or act on carriage return, accordingly. elif inp is not None: otxt = readline.process_keystroke(inp) if readline.carriage_returned: if readline.content.startswith('/'): if process_cmd(pager, readline.content): pager = get_pager(pager) echo(refresh(pager, readline, init=True)) elif (0 != len(readline.content.strip())): line = readline.content.strip() server.privmsg(channel, line) pager.append(format_chat(server.nickname, channel, line)) dirty = time.time() readline = get_inputbar(pager) echo(readline.refresh()) elif 0 == len(otxt): if type(inp) is int: echo(pager.process_keystroke(inp)) else: echo(u''.join(( readline.fixate(-1), readline.colors.get('highlight', u''), otxt, term.normal))) # update pager contents. Its a lot for 9600bps .. if server.dirty is not None: dirty = dirty or server.dirty if dirty is not None and time.time() - dirty > POLL_OUT: echo(refresh(pager, readline)) dirty = None server.dirty = None # poll irc client stuff client.process_once(POLL_IRC) echo(u''.join((term.move(term.height, 0), term.normal))) server.quit() return True