Пример #1
0
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()    
Пример #2
0
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()
Пример #3
0
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)
Пример #4
0
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