Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2006-06-06

[Ruby]Nadokaさんでinviteしたい

Nadokaさんのbotで任意のユーザーを任意のチャンネルに招待する処理を書きたくなった。IRCコマンドに次のように使うinviteコマンドがある。

/invite <nickname> <channel name>

Nadokaさんでinviteメソッドかなにか用意されていないかなと思ってソースをgrepすると何も引っかからない。

bot.rbを見てみるとこんな感じでIRCコマンドを実行しているようだ。

send_msg Cmd.nick(nick)

しかしそれっぽいキーワードでgrepしてもメソッド定義が見つからない。Cのほうからやってきた身としては、メソッドはソースのどこかにちゃんと記述されているものだと思いこみがち。昔の自分ならこのへんでくじけているところだ。最近はその限りでないことを知っている。というわけでソースをもう少し見てみる。Cmdをgrepするとこんなものを発見。

Cmd = ::RICE::Command

ふむ。RICEのほうを見てみる。おぉ。

Commands = {}
%w(PASS NICK USER OPER MODE SERVICE QUIT SQUIT
   JOIN PART TOPIC NAMES LIST INVITE KICK
   PRIVMSG NOTICE MOTD LUSERS VERSION STATS LINKS
   TIME CONNECT TRACE ADMIN INFO SERVLIST SQUERY
   WHO WHOIS WHOWAS KILL PING PONG ERROR
   AWAY REHASH DIE RESTART SUMMON USERS WALLOPS USERHOST ISON
).each do |cmd|
  self.regist_command cmd
end

なるほど。regist_commandの中でevalしているのだ。これじゃあinviteメソッド定義を探しても見つからないわけだ。カラクリはわかったのでbotに以下のメソッドを追加して無事目標達成。

def invite nick, ch
  send_msg Cmd.invite(nick, ch)
end

きっとこれが「ルーク、ソースを使え」ってやつだね。