誰得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に反応しないという暗黙のルール