【问题标题】:How can I get these Perl scripts to delay?我怎样才能让这些 Perl 脚本延迟?
【发布时间】:2015-09-14 15:09:04
【问题描述】:

我正在用 Perl 制作一个简单的 IRC 机器人,可以用来“猎鸭”以响应 this IRC game bot。我在私人脚本频道irc.freenode.net ##duckhunt2 上执行此操作,以免干扰真人玩游戏。

到目前为止,我已经尝试使用 Net::IRC 和 XChat 插件 with my code here 制作 Perl 机器人。鸭源机器人发送类似

的消息
・゜゜・。。・゜゜\_O< quack!

自最后一只鸭子被射杀后 8 到 60 分钟之间的随机时间,让您知道鸭子已经到了。然后您可以回复.bang 射击鸭子并在您的分数上加一分。但是,如果你回复得太快(在一秒钟内),它会让你进入 2 小时的冷却模式,你不能射击任何鸭子。有时它还会因为“卡枪”等原因导致 7 秒的冷却时间,如游戏机器人代码的第 272 行所示。

Perl 代码

use Net::IRC;
use Time::HiRes qw(usleep nanosleep);

$ducksource = 'DUCK_SOURCE';
$server     = 'IRC_SERVER';
$channel    = 'IRC_CHANNEL';
$botnick    = 'BOT_NICKNAME';
$botnick2   = 'BOT_BACKUP_NICKNAME';
$password   = 'BOT_PASSWORD';
$botadmin   = 'BOT_ADMIN_NICKNAME';

$irc = new Net::IRC;

$conn = $irc->newconn(
    Nick     => $botnick,
    Server   => $server,
    Port     => IRC_SERVER_PORT,
    Username => $botnick
);

$conn->add_global_handler('376',        \&on_connect);
$conn->add_global_handler('disconnect', \&on_disconnect);
$conn->add_global_handler('kick',       \&on_kick);
$conn->add_global_handler('msg',        \&on_msg);
$conn->add_global_handler('public',     \&on_public);

$irc->start;

sub on_connect {

    $self = shift;

    $self->privmsg('nickserv', "identify $password");
    $self->join($channel);

    print "Connected\n";
}

sub on_disconnect {

    $self = shift;

    print "Disconnected, attempting to reconnect\n";
    $self->connect();
}

sub on_kick {

    $self = shift;

    $self->join($channel);
    $self->privmsg('nickserv', "/nick $botnick");
}

sub on_msg {

    $self  = shift;
    $event = shift;

    if ($event->nick eq $botadmin) {

        foreach $arg ($event->args) {

            if ($arg =~ m/uptime/) {
                $self->privmsg($botadmin, `uptime`);
            }
        }
    }
}

sub on_public {

    $self  = shift;
    $event = shift;

    if ($event->nick eq $ducksource) {

        foreach $arg ($event->args) {

            if (($arg =~ m/</) && ($arg !~ m/>/)) {
                usleep(250000);
                $self->privmsg($channel, ".bang");
            }

            if (   ($arg =~ m/missed/)
                || ($arg =~ m/jammed/)
                || ($arg =~ m/luck/)
                || ($arg =~ m/WTF/)) {
                $self->privmsg('nickserv', "/nick $botnick2");
                $self->privmsg($channel,   ".bang");
                $self->privmsg('nickserv', "/nick $botnick");
            }

            if (($arg =~ m/script/) || ($arg =~ m/period/)) {
                $self->privmsg('nickserv', "/nick $botnick2");
                $self->privmsg($channel,   ".bang");
            }
        }
    }
}

Perl bot 连接到服务器,加入聊天室,并响应出现的鸭子,但我无法让它延迟发送命令 .bang 以便游戏机器人在 1 秒后收到它已经过去了,我没有进入两小时冷却模式。

我知道 Perl sleep 命令只接受一秒的倍数。我需要延迟 0.25 秒,因为消息到达游戏机器人大约需要 0.75 秒,所以我尝试使用 Time::HiRes 和 usleep 命令,它使用微秒(1,000 微秒 = 1 毫秒)。

在我的代码的第 61 行,我添加了 usleep(250000),这将使脚本暂停 0.25 秒,然后在下一行发送消息

$self->privmsg($channel, ".bang")

但是脚本不会等待——它只是像往常一样发送消息。它的行为就像它忽略了usleep 命令。

如何解决这个问题并让机器人在发送消息之前等待?

其次,我对如何更改昵称感到困惑。如果游戏机器人给了我 7 秒的冷却时间,我想快速将我的昵称更改为另一个昵称(例如 HunterBot6000HunterBot6000_)射击鸭子(.bang),然后在另一个机器人之前将我的昵称改回得到鸭子。通常,您通过/nick NEWNICK 命令完成昵称更改。但是,我尝试将此命令发送到频道和 NickServ,这并没有改变我的昵称。我应该如何做到这一点?

我还尝试为脚本编写一个 XChat 插件,看看是否能解决时间问题,但这也不起作用。在连接到服务器并加入 XChat 中的聊天室后,我加载了插件,我遇到了同样的问题 - 它以 .bang 响应鸭子,但我无法让它在发送前等待。

您可以查看文档Writing a simple XChat Perl Script。我做错了什么?

【问题讨论】:

  • 是什么让您认为usleep 不起作用?在其前后打印出Time::HiRes::time

标签: perl bots irc


【解决方案1】:

你问了多个问题,但我只能通过手机回答一个问题

您可以通过发送更改昵称

NICK newnick

更多信息请见RFC 2812

但是,Net::IRC 可能有更合适的方法。

【讨论】:

  • 好的,感谢您的帮助。我将通过 Net::IRC 文档查找执行此操作的特定命令。
【解决方案2】:

我也遇到过 Time::HiRes 的睡眠问题。这应该会影响 250 毫秒的睡眠:

select(undef, undef, undef, 0.25);

【讨论】:

    【解决方案3】:

    感谢大家的帮助。我能够让usleep 命令工作并通过将延迟更改为更大的秒数(例如usleep(25000000),25 秒)然后通过删除一个0 更改回0.25 秒来验证它是否正确延迟一次。我还在之前和之后添加了print Time::HiRes::time;,以验证延迟是否有效。我还发现更改昵称的正确命令是$self-&gt;nick($botnick2);,尽管在任何 Net::IRC 文档中都找不到它。再次感谢大家的帮助和建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      相关资源
      最近更新 更多