誰得bot

無駄に電卓機能と翻訳機能をつけてみました。
日仏翻訳とか本当に無駄だし、誰も得しないけどつけてみました。

@Override
protected void onPrivateMessage(String sender, String login, String hostname, String message) {
	if (sender.equals(Settings.ORNER_NAME) && message.startsWith("#")) {
		// 自分用。botに自分の発言を代弁させる。
		String[] str = message.split(">");
		if (str.length == 2) {
			this.sendNotice(str[0], str[1]);
		}
	} else if (message.startsWith("@")) {
		// twitterの最新の発言を拾ってIRCに投げる
		message = message.substring(1);
		try {
			Status latest = twitter.getUserTimeline(message).get(0);
			this.sendNotice(sender, latest.getCreatedAt() + " " + latest.getText());
		} catch (TwitterException e) {
			this.sendNotice(sender, e.getMessage());
		}
	} else if (message.startsWith("calc>")) {
		sendResultOfCalculation(sender, message); // 電卓
	} else if (message.startsWith("je>")) {
		sendResultOfTranslation(sender, message, Language.JAPANESE, Language.ENGLISH); // 日英翻訳
	} else if (message.startsWith("ej>")) {
		sendResultOfTranslation(sender, message, Language.ENGLISH, Language.JAPANESE); // 英日翻訳
	} else if (message.startsWith("pj>")) {
		sendResultOfTranslation(sender, message, Language.PORTUGUESE, Language.JAPANESE); // ポ日翻訳
	} else if (message.startsWith("jp>")) {
		sendResultOfTranslation(sender, message, Language.JAPANESE, Language.PORTUGUESE); // 日ポ翻訳
	} else if (message.startsWith("fj>")) {
		sendResultOfTranslation(sender, message, Language.FRENCH, Language.JAPANESE); // 仏日翻訳
	} else if (message.startsWith("jf>")) {
		sendResultOfTranslation(sender, message, Language.JAPANESE, Language.FRENCH); // 日仏翻訳
	} else if (message.startsWith("cj>")) {
		sendResultOfTranslation(sender, message, Language.CHINESE_TRADITIONAL, Language.JAPANESE); // 中日翻訳
	} else if (message.startsWith("jc>")) {
		sendResultOfTranslation(sender, message, Language.JAPANESE, Language.CHINESE_TRADITIONAL); // 日中翻訳
	} else if (message.contains("ぬるぽ") || message.contains("ヌルポ") || message.contains("ヌルポ")
			|| message.contains("NullPointer")) {
		this.sendNotice(sender, sender + ": " + "ガッ");
	}
}


追加した各種メソッド

※使用した外部ライブラリ
PircBot http://www.jibble.org/pircbot.php
Twitter4J http://yusuke.homeip.net/twitter4j/ja/index.html
google-api-translate-java http://code.google.com/p/google-api-translate-java/

private double calculate(String exp) {
	try {
		ScriptEngineManager factory = new ScriptEngineManager();
		ScriptEngine engine = factory.getEngineByName("JavaScript");
		return (Double) engine.eval(exp);
	} catch (ScriptException e) {
		throw new RuntimeException(e);
	}
}

private String replace4Calc(String exp) {
	exp = exp.replace(" ", "");
	exp = exp.replace(" ", "");
	exp = exp.replace("+", "+");
	exp = exp.replace("−", "-");
	exp = exp.replace("ー", "-");
	exp = exp.replace("*", "*");
	exp = exp.replace("×", "*");
	exp = exp.replace("x", "*");
	exp = exp.replace("/", "/");
	exp = exp.replace("÷", "/");
	exp = exp.replace("%", "%");
	exp = exp.replace("(", "(");
	exp = exp.replace(")", ")");
	exp = exp.replace("1", "1");
	exp = exp.replace("2", "2");
	exp = exp.replace("3", "3");
	exp = exp.replace("4", "4");
	exp = exp.replace("5", "5");
	exp = exp.replace("6", "6");
	exp = exp.replace("7", "7");
	exp = exp.replace("8", "8");
	exp = exp.replace("9", "9");
	exp = exp.replace("0", "0");

	exp = exp.replace("=", "");
	return exp;
}

void sendResultOfCalculation(String target, String message) {
	String exp = message.substring(5);
	try {
		double result = calculate(replace4Calc(exp));
		this.sendNotice(target, "> " + Double.toString(result));
	} catch (Exception e) {
		this.sendNotice(target, "> calculation failed");
	}
}

void sendResultOfTranslation(String target, String message, Language from, Language to) {
	message = message.substring(3);
	Translate.setHttpReferrer("http://code.google.com/p/google-api-translate-java/");
	try {
		this.sendNotice(target, "> " + Translate.execute(message, from, to));
	} catch (Exception e) {
		this.sendNotice(target, "> translation failed");
		e.printStackTrace();
	}
}

某ぷよchでは現在このbot@dekosuke作のbotがいるのですが、上記の機能然り、連鎖数によってお邪魔ぷよの量を算出する機能や、非想天則の技を調べる機能など本当に無駄な高機能化がなされていっています。が、botはやりすぎるとうざいのでそろそろ自重した方がいいかなと思っています。正直飽きてきたし><

ちなみに、このbotはプライベートメッセージでのやり取りが可能なのでチャンネルのログを汚すのがためらわれる場合は、プライベートメッセージでコマンドを叩いてください。>チャンネル住人


15:02 (id:k-z-h) prvmsgだとbot同士が反応し合って無限ループが出るので、文化としてnoticeを使い、かつbotはnoticeに反応しないという暗黙のルール

bot戦争 #acotie

id:Yoshioriさんが遅刻してる人のtwitterのpostをIRCに投げるyamashiro-botなるものを作ったので応戦せざるをえない。
yamashiro-botIRCに書かれた対象のtwitter-idの最新のpostを拾ってIRCに投げる仕様。言語はPython


なので、カイジbotを改造して、自分のtwitter-idがIRCに書かれたら、
yamashiro-botより先に「@noire722を攻撃することはできない」とtwitterにpostしてヘブンズドアーする作戦に出た。言語の処理速度の差でこれで勝つると思っていた。

が、ダメッ・・・。


カイジbotはid取得に正規表現を使っていたのでString.intern()で文字列比較することにした。
が、再び敗北。


ms単位の戦い。


twitterのwebアプリの処理(おそらくpost時の認証処理)にボトルネックがある気がするのでこれ以上の高速化が無理なら報復作戦に出るべきかもしれない・・・うーん、悔しい。。



「戦争だろうが…手動ならまだしもbot作ったら…戦争だろうがっ…!戦争じゃねえのかよっ…!」


※あとでやるメモ)GCJ

java irc カイジ bot

ふらっとIRCbot作ってみた。
PircBot(http://www.jibble.org/pircbot.php)というライブラリを使わせていただきました。

たとえばトークで「金」と話しかければ「金」を含んだカイジの名言を教えてくれます。

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jibble.pircbot.PircBot;

public class JkBot extends PircBot {
	private static final String DB_CONNECT = "jdbc:mysql:///database名?useUnicode=true&characterEncoding=UTF8";
	private static final String USER_ID = "id";
	private static final String USER_PW = "pass";
	private static final int INTERVAL = 5000;
	private static final int MSG_LIMIT = 128;
	private static final int RESULT_LIMIT = 5;
	// error-code
	private static final int TOO_MANY_ACCESS = 0;
	private static final int WRONG_KEYWORD = 1;
	private static final int TOO_MANY_RESULTS = 2;
	private static final int NO_RESULT = 3;

	public JkBot() {
		this.setName("name");
		this.setMessageDelay(INTERVAL);
		try {
			this.setEncoding("UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}

        // トークでメッセージを受け取ったときの処理
	@Override
	protected void onPrivateMessage(String sender, String login,
			String hostname, String message) {
                // 正規表現で半角記号をはじく
		Pattern pattern = Pattern.compile("\\p{Punct}");
		Matcher matcher = pattern.matcher(message);
		if (matcher.find()) {
			sendErrMsg(sender, WRONG_KEYWORD);
			return;
		}

		KaijiSearch ks = new KaijiSearch(DB_CONNECT, USER_ID, USER_PW);
		message = message.replace(" ", " ");

		List<String> kList = null;
		try {
			kList = ks.searchWords("k", message.split(" "));
		} catch (Exception e) {
			sendErrMsg(sender, WRONG_KEYWORD);
			return;
		}

		if (kList.size() == 0) {
			sendErrMsg(sender, NO_RESULT);
			return;
		} else {
			int cnt = 0;
			for (String word : kList) {
				if (word.length() <= MSG_LIMIT) {
					this.sendNotice(sender, word);
				} else {
					List<String> sendList = new ArrayList<String>();
					String temp = word;
					while (temp.length() > MSG_LIMIT) {
						sendList.add(temp.substring(0, MSG_LIMIT));
						temp = temp.substring(MSG_LIMIT);
					}
					sendList.add(temp);
					for (String msg : sendList) {
						this.sendNotice(sender, msg);
					}
				}
				cnt++;
				if (cnt >= RESULT_LIMIT) {
					this.sendNotice(sender, "--" + RESULT_LIMIT + " of "
							+ kList.size() + " results. --");
					break;
				}
			}
			this.sendNotice(sender, "*- end -*");
		}
                ks.closeConnection();
	}

	private void sendErrMsg(String sender, int code) {
		String msg = "";
		switch (code) {
		case TOO_MANY_ACCESS:
			msg = "-ERROR- too many access. plz retry after a minutes.";
			break;
		case WRONG_KEYWORD:
			msg = "-ERROR- some words are wrong.";
			break;
		case TOO_MANY_RESULTS:
			msg = "-ERROR- too many results. i can receive 100 or less.";
			break;
		case NO_RESULT:
			msg = "-ERROR- no result.";
			break;
		}
		this.sendNotice(sender, msg);
	}
}

某チャンネルに潜伏中

文字コード

コマンドプロンプトutf-8を表示できないことに気付くまでの数時間。priceless・・・


めも)デフォルトのエンコーディングを変更する方法

/usr/lib/python2.4/site-package/sitecustomize.pyを作成

import sys
sys.setdefaultencoding('utf-8')

めも

PythonPythonの外部ライブラリを使いたい
JavaGUIをSwingで作りたい
Jython使えばまるっと解決するんじゃないかと思って使い始めてみました。


流れとしては、Pythonコードで主な処理を実装して、
ビューにあたる処理をJavaで作ってクラスをインポートする。
という感じになるのかな(?


できれば逆がやりたいのだけど・・・
JavaPythonのクラスをインポートして使いたい。


Pythonの標準ライブラリなら普通に使えるけど、
外部ライブラリをインポートできないエラーに遭遇して未解決。
JVMからライブラリのパスが見えていないだけなのかなぁ。
Pythonインタプリタで実行したら普通に通るし・・。



(追記

>Not having Tkinter in Jython, you can either rewrite your app to be a
>Java Swing app, or you can embed the Java JVM into the Python
>interpreter as an importable library.

そういうことですか。。どうしようかな。。