2013/05/14


おしょうさんのを盛大にパクった。罪悪感はない。
netlib で HTTP Server を書いてみた - C++でゲームプログラミング

netlib で HTTP Server を書いてみた Boost . Asio だけだとしんどそうだったので netlib でちょっと書いてみました。 [環境] netlib 0...

http://d.hatena.ne.jp/osyo-manga/20130511/1368242653
mattn/cpp-lingrbot - GitHub
https://github.com/mattn/cpp-lingrbot
#include <boost/network/include/http/server.hpp>
#include <picojson.h>

struct cpp_bot {
  typedef boost::network::http::server<cpp_bot> server;

  void
  operator ()(server::request const &request, server::response &response) {
    namespace http = boost::network::http;
    typedef server::string_type string;
    string body = request.body;
    std::ostringstream data;

    std::cout << body << std::endl;
    picojson::value v;
    string err;
    picojson::parse(v, body.begin(), body.end(), &err);
    if (!err.empty()) {
      response = server::response::stock_reply(
        server::response::bad_request, "invalid request"
      );
      return;
    }

    if (!v.is<picojson::object>()) {
      response = server::response::stock_reply(
        server::response::bad_request, "invalid request"
      );
      return;
    }
    picojson::array arr;
    picojson::object obj;
    
    obj = v.get<picojson::object>();
    v = obj["events"];
    if (!v.is<picojson::array>()) {
      response = server::response::stock_reply(
        server::response::bad_request, "invalid request"
      );
      return;
    }

    arr = v.get<picojson::array>();
    BOOST_FOREACH(auto x, arr) {
      if (!x.is<picojson::object>()) {
        continue;
      }
      picojson::value message = x.get<picojson::object>()["message"];
      if (!message.is<picojson::object>()) {
        continue;
      }
      picojson::value text = message.get<picojson::object>()["text"];
      if (!text.is<string>()) {
        continue;
      }
      string str = text.get<string>();
      if (str.find("cpp"0) != string::npos) {
        data << "くぴぴ\n";
      }
    }

    std::string ret = data.str();
    size_t e = ret.find_last_not_of(\t\r\n");
    if (e != string::npos) {
      ret = string(ret, 0, e);
    }
    response = server::response::stock_reply(
      server::response::ok, ret
    );
  }

  void
  log(...){
    
  }
};


int
main(){
  typedef cpp_bot::server server;
  
  auto address = "localhost";
  auto port = "11614";
  try{
    cpp_bot handler;
    server server_(address, port, handler);
    server_.run();
  }
  catch(std::exception& e){
    std::cout << e.what() << std::endl;
    return 1;
  }

  return 0;
}
cpp という単語が含まれた発言に反応して「くぴぴ」と80年代アニメ風に応答します。

Posted at by



2013/05/08


以前から携帯から IRC する手段として mobirc を使ってきたのだけど、使ってるサーバのリソースが少なすぎてちょくちょく困ってました。
「これ、Go言語で書いたらパフォーマンスも出るし、使用リソースも減るし万々歳じゃね?」というアホの一つ覚えみたいな動機で作り始めました。
mattn/gomirc - GitHub
https://github.com/mattn/gomirc
mobirc とほぼ同等の機能が動きます。
  • 複数ネットワーク
  • クリッカブルリンク
  • 画像インライン表示
  • 新着件数表示
  • ログイン機能
iPhoneビューも付いてます。
gomirc
あと、バックログ機能が付いてましてサーバを再起動したい場合は CTRL-C すると backlog.json というファイルに最新100件のバックログが保存されます。
config.json は以下の様に記述します。
{
    "irc": [
        {
            "name""freende",
            "host""irc.freenode.net:6668",
            "user""my-username",
            "password""my-password",
            "channels": ["golang-nuts"]
        },
        {
            "name""perl",
            "host""irc.perl.org:6668",
            "user""my-username",
            "password""my-password"
        }
    ],
    "web": {
        "addr"":5004",
        "password""dankogai"
        "root""/mobirc/",
        "backlog""./backlog.json",
        "keywords": ["dan""kogai"]
    }
}
root が指定出来るので、サブディレクトリにインストールしたい人も安心設計。
ちゃんと計測していませんが、perl 版を使っていた頃に比べて top の RSS が 2/3 程度に減りました。
あと先日書いた lingr-ircd を使えばこの gomirc からも扱えますし
mattn/go-lingr - GitHub
https://github.com/mattn/go-lingr
znc を使えば複数のネットワークを束ねる事も出来ます。
znc
これで何時でも何処でも IRC 出来る様になりますね。よろしければどうぞ。
pull リクエストもお待ちしております。
Posted at by




ディレクトリを監視して、変更があれば指定のコマンドを実行してくれるツール gomon を c9s さんが作ってくれました。
c9s/gomon - GitHub
https://github.com/c9s/gomon
この gomon を活用すべく goalert というツールを作りました。
mattn/goalert - GitHub
https://github.com/mattn/goalert
これらを組み合わせて $ gomon . -- goalert go build -x とやっておくと、ソースの修正に伴い goalert が起動し、goalert が go build を実行します。結果としてエラーになった場合は、goalert が Growl サーバに結果を投げてくれます。
goalert
めっちゃ便利になりました。
Posted at by