Messenger plus!用スクリプト 修正版

初回ゲーム中メッセージ送信時にヘルプも送信するつもりだったのにできてなかったバグを修正。ついでにオートパイロットモードのメッセージも追加。
第二ブータン帝国の4コマ漫画「東の方」ネタが含まれております。
あと今気づいた致命的な欠陥として、両者がこのスクリプトを適用してどちらかが「#auto」を実行するとお互いにオートパイロットモードになり自動返信しあって無限ループに陥ります。解決案模索中。

function OnEvent_Initialize(MessengerStart){
	Debug.ClearDebuggingWindow();
	Debug.Trace("Init");
}

function OnEvent_Uninitialize(MessengerExit){
	Debug.Trace("Uninit");
}

function irand(n){
	return Math.floor(Math.random() * n);
}

var TARGETS = [
	{className: "SWT_Window0", message: "Eclipseで開発してるみたいです"},
	{className: "BASE", message:"東方で遊んでいるみたいです"},
	{className: "th105_106", message:"東方緋想天で遊んでいるみたいです"}
];
var MODE_FIRST = 1;
var MODE_ENABLE = 2;
var MODE_DISABLE = 3;
var MODE_AUTO = 4;
var mode = {};
var HANDLE_MOD = 10007;
var HELP_STRING =
	"#help このヘルプを表示\n" +
	"#enable 通常モード\n" +
	"#disable 無効化\n" +
	"#auto オート会話モード";
var AUTO_MESSAGE = [
	"///",
	"//////",
	"////////////",
	"集いしコードが新たに輝くバグとなる。\n光差す朝となれ! シンクロ召喚!\n飛翔せよ、スパゲティ・コード!",
	"再帰の鼓動、今ここに列を成す!\n天地鳴動のバグを見るがいい! シンクロ召喚!\nわが魂、スタック・オーバーフロー・エラー!!",
	"ぬ",
	"ンエエンチン\nヒント:春の食べ物ダヨ!",
	"明日はおでんにしよう",
	"え?・・・あっ!!ハイ!!しょうゆですね!?"
];

function OnEvent_ChatWndReceiveMessage(ChatWnd, Origin, Message, MsgKind){
	var WndId = ChatWnd.Handle % HANDLE_MOD;
	if(!mode[WndId]){
		mode[WndId] = MODE_FIRST;
	}
	var isSpecial = true;
	switch(Message){
	case "#help":
		ChatWnd.SendMessage(HELP_STRING);
		break;
	case "#enable":
		mode[WndId] = MODE_ENABLE;
		ChatWnd.SendMessage("通常モードになりました");
		break;
	case "#disable":
		mode[WndId] = MODE_DISABLE;
		ChatWnd.SendMessage("無効になりました");
		break;
	case "#auto":
		mode[WndId] = MODE_AUTO;
		ChatWnd.SendMessage("オートパイロットモードスタンバイ\nライディングトークアクセラレーション!");
		break;
	default:
		isSpecial = false;
	}
	if(isSpecial || Origin == Messenger.MyName){
		return Message;
	}
	Debug.Trace("Receive from: " + Origin);
	var hwnd = Interop.Call("user32.dll", "GetForegroundWindow");
	var SIZE = 1024;
	var strbuf = Interop.Allocate(2 * SIZE);
	Interop.Call("user32.dll", "GetClassNameW", hwnd, strbuf, SIZE);
	var className = strbuf.ReadString(0);
	Debug.Trace("Foreground window class: " + className);
	strbuf.Size = 0;
	var index = -1;
	for(var i=0; i<TARGETS.length; i++){
		if(className == TARGETS[i].className){
			index = i;
			break;
		}
	}
	switch(mode[WndId]){
	case MODE_FIRST:
	case MODE_ENABLE:
		if(index != -1){
			ChatWnd.SendMessage(TARGETS[i].message);
			if(mode[WndId] == MODE_FIRST){
				ChatWnd.SendMessage(HELP_STRING);
				mode[WndId] = MODE_ENABLE;
			}
		}
		break;
	case MODE_DISABLE:
		break;
	case MODE_AUTO:
		ChatWnd.SendMessage(AUTO_MESSAGE[irand(AUTO_MESSAGE.length)]);
		break;
	}
	return Message;
}