IRCでボット作ったり、ログをTiarraで取得したり

以下をやってみた時の作業メモ

+ IRCサーバーを立てる
+ IRCクライアントから接続する
+ IRCのbotを作成してみる
+ IRCのログを取得する
+ IRCのログをブラウザで表示する

# 環境

+ クライアント->Mac OSX(10.11.4)
+ サーバー->Ubuntu14.04

# IRCサーバーの構築

Vagrantを使ってローカルにUbuntuのVMを立てて、そこにIRCサーバーを立てました。

VMにはプライベートIPを割り当てて接続します。
ポートフォワードでも大丈夫だと思います。

```text:Vagrantfile
config.vm.network "private_network", ip: "192.168.33.10"
```

UbuntuにSSHログイン後、以下のコマンドでインストールします。
`/etc/ngircd/ngircd.conf`に設定ファイルがありますが、特に制限などはしないので今回は編集してません。

```bash
$sudo apt-get update

# 確認
$sudo apt-cache search ngircd
ngircd - lightweight Internet Relay Chat server

# インストール
$sudo apt-get install ngircd

# 起動
$sudo /etc/init.d/ngircd start
```

Mac側から接続確認

```bash
$nc -w 1 192.168.33.10 6667
$echo $?
0
```

OKですね。

# IRCクライアントからの接続

MacにIRCクライアントをインストールして接続してみます。
今回はWindowsで使ったことのある[LimeChat for Mac](http://limechat.net/mac/ja.html)を使ってみました。

起動後、IRCサーバーの指定でIPアドレスを「192.168.33.10」と指定することで接続できました。

また、検証のために適用なチャンネルを作り、参加します。

![Screen Shot 2016-05-07 at 7.01.49 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/34d721a5-718b-55e2-c227-7d46a5bec4bd.png "Screen Shot 2016-05-07 at 7.01.49 AM.png")


大丈夫そうです。

# 簡単な返信ボットを作ってみる

[IRC BOTを作って仕事をさせるようにした](http://blog.glidenote.com/blog/2013/05/20/working-with-irc-bot/)

こちらに記載のある[cinch](https://github.com/cinchrb/cinch)というRubyで簡単にbotを作れるフレームワークを今回は利用してみました。

まずはGemでcinchをインストールします。

```bash
$gem install cinch
```

READMEを参考にhelloと言ったら返事をしてくれるbotを作ってみます。

```hello_bot.rb
require 'cinch'

bot = Cinch::Bot.new do
  configure do |c|
    c.server = '192.168.33.10'
    c.channels = ['#zatu']
    c.nick = 'toshi_bot'
    c.realname = 'toshi_bot'
    c.user= 'toshi_bot'
  end

  on :message, 'hello' do |m|
    m.reply "Hello, #{m.user.nick}"
  end
end

bot.start
```

実行します。

```bash
$ruby hello_bot.rb
```

この状態で「hello」と発言すると返信してくれます。

![Screen Shot 2016-05-07 at 8.08.24 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/1717c75a-6ae7-e52c-c768-fe202dadb592.png "Screen Shot 2016-05-07 at 8.08.24 AM.png")

簡単にできました。

# 天気情報を取得してくる

[天気情報を取得する](http://qiita.com/s0hno/items/b67a24bd3cbeb6e7cdc0)

上記を参考に天気情報を取得して表示するのを作ってみます。

最初にRESTで情報を取得する際に必要なAPIKEYを取得します。

[OpenWeatherMap](http://openweathermap.org/)にログインして、アカウントを作成します。（無料です）

上記によってAPKEYが取得できるのでメモします。

試しに現在の天気が取得できるかやってみます。
aapidの値は取得したAPIキーを利用してください。

```bash
$curl http://api.openweathermap.org/data/2.5/weather\?q\=tokyo,jp\&appid\=xxxxxx
{"coord":{"lon":139.69,"lat":35.69},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04n"}],"base":"stations","main":{"temp":293.89,"pressure":1007,"humidity":68,"temp_min":290.93,"temp_max":297.04},"visibility":10000,"wind":{"speed":12.9,"deg":200},"clouds":{"all":75},"dt":1462577628,"sys":{"type":1,"id":7619,"message":0.0137,"country":"JP","sunrise":1462477394,"sunset":1462527171},"id":1850147,"name":"Tokyo","cod":200}%
```

まずは先に情報を取得するスクリプトを確認してみます。

```hoge.rb
require 'json'
require 'uri'
require 'net/http'
require 'pp'

CITY = 'tokyo'
APIKEY = ''

uri = URI.parse("http://api.openweathermap.org/data/2.5/weather?q=#{CITY},jp&appid=#{APIKEY}")
json = Net::HTTP.get(uri)
result = JSON.parse(json)
pp result['weather'][0]['description']
```

```fuga.rb
require 'cinch'
require 'json'
require 'uri'
require 'net/http'

APIKEY = ''

bot = Cinch::Bot.new do
  configure do |c|
    c.server = '192.168.33.10'
    c.channels = ['#zatu']
    c.nick = 'toshi_bot'
    c.realname = 'toshi_bot'
    c.user= 'toshi_bot'
  end

  on :message, /^weather (.+)/ do |m, city|
    uri = URI.parse("http://api.openweathermap.org/data/2.5/weather?q=#{city},jp&appid=#{APIKEY}")
    json = Net::HTTP.get(uri)
    result = JSON.parse(json)
    description = result['weather'][0]['description']
    m.reply "#{city} is #{description}"
  end
end

bot.start
```
![Screen Shot 2016-05-07 at 10.51.35 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/fba33360-92ed-ca97-922a-e5549e096598.png "Screen Shot 2016-05-07 at 10.51.35 AM.png")

いいですね。
それらしいのが出来ました。

# TiarraでIRCのログを残す

[[IRC][さくらのVPS]tiarra を入れたので設定をメモしておくAdd Star](http://d.hatena.ne.jp/amari3/20111203/1322937053)

IRCではログアウトしている時の会話を確認する事が出来ません。
また、昔のログを残す事が出来ません。
上記問題に対してProxyとなるサーバーを立てて、プロセスを常駐させることでログアウト時を含むIRCログの取得を行います。

今回はIRCのProxyサーバーとして[Tiarra](http://www.clovery.jp/tiarra/)というものを使ってみます。

まずはダウンロードと配置。

```bash
$wget http://www.clovery.jp/tiarra/archive/2010/02/tiarra-20100212.tar.gz
$tar -zxvf tiarra-20100212.tar.gz
$ln -s tiarra-20100212 tiarra
```

次に設定ファイルを作成します。

```bash
$cd tiarra
$cp -p sample.conf tiarra.conf
```

cryptされたパスワードを生成します。

```bash
$./tiarra --make-password
Tiarra encrypts your raw password to use it for config file.

Please enter raw password: xxxxx

cxNYayoReiBIQ is your encoded password.
Use this for the general/tiarra-password entry.
```

次に設定ファイルのtiarra.confを設定します。
設定が幾つかのブロックに分かれています。

## generalブロック

全体的な設定です。

```text:
  # ユーザー情報
  # 省略不能です。
  nick: toshi
  user: toshi
  name: toshi
  
  # Tiarraが開くポート。ここに指定したポートへクライアントに接続させる。
  # 省略されたらポートを開かない。
  tiarra-port: 6667
  
  # Tiarraにクライアントが接続する際に要求するパスワードをcryptした文字列。
  # 空の文字列が指定されたり省略された場合はパスワードを要求しない。
  # crypt は ./tiarra --make-password で行えます。
  tiarra-password: cxNYayoReiBIQ  
```

## networksブロック

接続するIRCサーバーのネットワークの名称を設定します。
複数ある場合には複数の名称を設定します。
今回の例では一つ。

```text:
name: virtualbox
```

## 各ネットワークの設定

networksブロックで作成したブロック数分定義します。
今回は一つ。

```text:
virtualbox {
  # サーバーのホストとポートを指定。複数行可。(host/port が指定されていない場合>は)省略不可。
  # 同じサーバの複数のポート指定は順番に試すので、大量に書かない方がよい。
  server: 192.168.33.10 6667
}
```

## ログを取得できるようにする

以降は各機能で「-」を「+」に変更することで機能を有効化できます。

```text:
- Log::Channel {
  以下に変更
+ Log::Channel {
```

また、以下のように設定することで指定したチャンネルのみログを取ることができます。
以下の設定ではネットワークで「virtualbox」と指定したIRCサーバーの#zatuというチャンネルをlog/zatuフォルダ配下に保存します。

```text:
  channel: zatu #zatu@virtualbox
```

## 接続時に最近のログを表示

以下の記述に変更することで最近のログをログイン時に表示します。

```text:
- Log::Recent {
  以下に変更
+ Log::Recent {

```

## 接続時に自動的にログインするチャンネルを設定

以下で接続時に自動参加するチャンネルを設定します。

```text:
- Channel::Join::Connect {
  以下に変更
+ Channel::Join::Connect {
```

上記で設定を有効化し、チャンネルを設定します。

```text:
channel: #zatu@virtualbox
```

これで設定はできたのでtiarraを起動します。

```bash
./tiarra
```

ログが標準出力で表示されるので最初はこの状態で起動してみるのが良いと思います。
問題なければ`./tiarra &`でバックグラウンド起動させておけば良いかと思います。

tiarraのプロセスが動いている状態でLimechatからはlocalhostのtiarra経由でIRCへ接続します。

接続時に設定したパスワードを指定することを注意。
接続がうまくできれば「#zatu@virtualbox」チャンネルに自動でログインできるはずです。

# ログをブラウザで表示してみる

以下を参考にログをブラウザで表示してみました。

[PHP IRC Log ViewerをリファクタリングしてTiarra対応にしてみた](http://blog.a-way-out.net/blog/2014/02/04/refactor-irc-log-viewer/)

```bash
$git clone https://github.com/kenjis/irc-log-viewer
```

ログフォーマットをTiarraのものに変更します。

```index.php
//$logFormat = new LogFormatOrig($channel);
// for Tiarra logs
$logFormat = new LogFormatTiarra('');
```

次にTiarraのログファイルをコピーします。

```bash
$ cp /Users/toshihirock/irc/tiarra/log/zatu/2016.05.07.txt sample-logs
```

最後に起動スクリプトを変更します。

```local.sh
PP_LOGDIR=./sample-logs \
```

設定ができたので起動してみます。

```bash
$./local.sh
```

これで

http://localhost:8000

にアクセスしてみます。

![Screen Shot 2016-05-07 at 6.39.26 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/323c3ecd-9535-b0fc-e2cd-9fcf0f51f90f.png "Screen Shot 2016-05-07 at 6.39.26 PM.png")

上記のように表示できました。