0

IRC に接続された Python ボットからの入力を正規化しようとしています。
私のpythonスクリプトはそのままです:http://pastebin.com/St4A1vLf

誰かが「!help」と言うと、これがコマンド プロンプトに表示されます (コマンド プロンプトでスクリプトを実行すると)。

:bot!~botty@112.443.22.5 #fish :!help

私がやりたいことは、変数 " data" を取り、それを正規化して、ユーザーのニックネーム、つまり " bot" だけを表示することです。そのため、コロン ' :' と残りの文字列 ( から!~) も削除されます。

!helpこの後、「 」と言ったユーザーにプライベートメッセージ/クエリを「 」で送信したいと思いますno help settings。(後でヘルプ コマンドを追加します。)

4

1 に答える 1

0

まず第一に、コマンドが欠落しているため、投稿した行は意味がありません。あなたがおそらく意味したのは

:bot!~botty@112.443.22.5 PRIVMSG #fish :!help

しかし、python 用の既存の irc 実装の 1 つ (twisted-words など) を使用しないのはなぜですか? これらを使用すると、特定のコマンド (この場合は PRIVMSG など) を簡単に処理できます。

これを行いたくない場合は、受信メッセージを手動で解析し、必要な情報を抽出する必要があります。

これは単純なパーサーです。lineサーバーから受信した 1 行です。

def parse_irc(line):
    src = None
    parts = line.split(' ')
    if parts[0][0] == ':':
        srcpart = parts.pop(0)[1:]
        src = {'ident': None, 'host': None}
        if '!' not in srcpart:
            # e.g. a message from a server
            src['nick'] = srcpart
        else:
            # nick!ident@host
            tmp = srcpart.split('!', 1)
            src['nick'] = tmp[0]
            src['ident'], src['host'] = tmp[1].split('@', 1)
    cmd = parts.pop(0)
    args = []
    for i, arg in enumerate(parts):
        if arg[0] == ':':
            args.append(' '.join(parts[i:])[1:])
            break
        args.append(arg)
    return src, cmd, args

解析された行は次のようになります。

> python ircparser.py 'PING :12345'
src:  None
cmd:  'PING'
args: ['12345']
> python ircparser.py 'NOTICE AUTH :Welcome to this server'
src:  None
cmd:  'NOTICE'
args: ['AUTH', 'Welcome to this server']
> python ircparser.py ':me!ident@host PRIVMSG #channel :hi'
src:  {'nick': 'me', 'host': 'host', 'ident': 'ident'}
cmd:  'PRIVMSG'
args: ['#channel', 'hi']
> python ircparser.py ':me!ident@host PRIVMSG #channel :!help me'
src:  {'nick': 'me', 'host': 'host', 'ident': 'ident'}
cmd:  'PRIVMSG'
args: ['#channel', '!help me']
于 2012-04-28T08:31:30.427 に答える