どどんとふと連携する秀丸エディタマクロ

最近のどどんとふは、WEB IFのインターフェースが追加されたので、ちょっと試してみました。


まず簡単なところから。WEB IFを使って、指定チャットルームに書き込んでみるテスト。
ブラウザのアドレスバーに以下のテキストを入力します。

http://www.dodontof.com/DodontoF/DodontoFServer.rb?webif=talk&room=0&name=ななしさん&message=TEST

おおー。


今度はダイスポッドを指定してみます。

http://www.dodontof.com/DodontoF/DodontoFServer.rb?webif=talk&room=0&name=ななしさん&message=7R6&bot=ShadowRun4

おおー。


そういえば僕が立てたサーバはBasic認証をかけてるので、こんな感じで使えばいいはず。

http://USERID:PASSWARD@XXXXX.sakura.ne.jp/DodontoF/DodontoFServer.rb?webif=talk&room=0&name=ななしさん&message=TEST

おおー。


ということは!
僕はWindows3.1時代からの秀丸エディタのユーザです。テキストを書く場合は大抵テキストエディタを使います。ブラウザがすぐ落ちちゃうのがあたり前という黎明期を過ごしたせいか、ブラウザで直接テキストを入力するという習慣があまりないのです。なんでもエディタに書いて、ブラウザに貼り付け。となると、エディタからWEB IFをコールすると(僕が)幸せになれるかもしれないような気がしてきました。


どりゃっ。
これでエディタ上からコピーするような感覚(選択して Ctrl+D)で、どどんとふにメッセージを送れます。

//================================
// どどんとふにPOSTする秀丸マクロ
//================================
// 起動前設定 : 1. 秀丸エディタ「その他」→「キー割り当て」で、
//                 本マクロが起動するように設定する。
//                (例えば Ctrl + D )
//              2.コンフィグ定義に以下の項目を設定する。
//               ・どどんとふURL
//               ・プレイルーム番号
//               ・ユーザ名
//
// 使用方法   : 1. 秀丸エディタで、どどんとふに送信したいテキストを選択する。
//              2. 本マクロが起動するように設定したキーを押下する(例:Ctrl + D)。
//
//------------
// コンフィグ
//------------
// どどんとふURL
$tergetURL  = "http://USERID:PASSWARD@XXXXX.sakura.ne.jp/DodontoF/DodontoFServer.rb";
// プレイルーム番号
$targetRoom = "0";
// ユーザ名
$userName = "ななしさん";
//-----------------------

// XMLHTTPオブジェクトを生成する。
#http = createobject( "Msxml2.XMLHTTP" );
if( #http == 0 ) {
	#http = createobject( "Microsoft.XMLHTTP" );
	if( #http == 0 ) {
		message "XMLHTTPオブジェクトの生成に失敗しました。";
		endmacro;
	}
}

// 範囲選択中であるか否かをチェックする。
if( selecting == 0 ) {
	message "送信文字列が未選択です。";
	endmacro;
}

// 選択文字列を取得する。
$inputMessage = gettext( seltopx, seltopy, selendx, selendy, 0 );
escape;	// 範囲選択の取消を行なう。

// ユーザ名をURLエンコードする。
call Utf8Encode $userName;
$userName = $$return;

// 改行を検索しつつ、メッセージを送信する。
#resultOffset = wcsstrstr( $inputMessage, "\x0d\x0a" );
if( #resultOffset == -1 ) {
	// 改行無
	$sendMessage = $inputMessage;
	call postDodontoF;
} else {
	#searchOffset = 0;
	#inputLength = wcslen( $inputMessage );
	while( 1 ) {
		#resultOffset = wcsstrstr( $inputMessage, "\x0d\x0a", #searchOffset );
		if( #resultOffset == -1 )
		{	// 最終行
			if( #inputLength == #searchOffset ) {
				break;
			}
			$sendMessage = wcsmidstr( $inputMessage, #searchOffset, #inputLength - #searchOffset );
			// message str( #searchOffset ) + "-" + str( #inputLength ) + "[" + $sendMessage + "]";
			call postDodontoF;
			break;
		}
		$sendMessage = wcsmidstr( $inputMessage, #searchOffset, #resultOffset - #searchOffset );
		// message str( #searchOffset ) + "-" + str( #resultOffset ) + "[" + $sendMessage + "]";
		call postDodontoF;
		#searchOffset = #resultOffset + 2;
	}
}

endmacro;
	releaseobject #http;

postDodontoF:
	// メッセージをURLエンコードする。
	call Utf8Encode $sendMessage;
	$sendMessage = $$return;

	// 送信文字列を生成する。
	$sendMessage = "webif=talk&room=" + $targetRoom + "&name=" + $userName + "&message=" + $sendMessage;
	//message $sendMessage;

	// どどんとふWEBIFをコールする。
	callmethod #http, "open", "POST", $tergetURL, true;
	callmethod #http, "send", $sendMessage;
	$sendMessage = "";
	sleep 1000;
	return;

Utf8Encode:
	##len = wcslen($$1);
	$$ret = "";
	##i = 0;
	while( ##i < ##len ) {
		$$code = wcsmidstr( $$1, ##i, 1 );
		##code = unicode( $$code );
		if( (##code >= '0' && ##code <= '9')
		 || (##code >= 'A' && ##code <= 'Z')
		 || (##code >= 'a' && ##code <= 'z')
		 || ##code == '_' ) {
			$$ret = $$ret + $$code;
		} else {
			// unicode --> utf-8変換
			if( ##code < 0x80 ) {
				//1バイト
			} else if( ##code < 0x800 ) {
				//2バイト
				##code = ((((##code / 0x40) & 0x1F) | 0xC0) * 0x100)
					   + ((##code & 0x3F) | 0x80);
			} else if( ##code < 0x10000 ) {
				//3バイト
				##code = ((((##code / 0x1000) & 0x0F) | 0xE0) * 0x10000)
					   + ((((##code / 0x40) & 0x3F) | 0x80) * 0x100)
					   + ((##code & 0x3F) | 0x80);
			} else /*if( ##code < 0x400000 )*/ {
				//4バイト
				##code = ((((##code / 0x40000) & 0x07) | 0xF0) * 0x1000000)
					   + ((((##code / 0x1000) & 0x3F) | 0x80) * 0x10000)
					   + ((((##code / 0x40) & 0x3F) | 0x80) * 100)
					   + ((##code & 0x3F) | 0x80);
			}
			$$hex = hex( ##code );
			if( (strlen($$hex) & 1) != 0 ) {
				$$hex = "0" + $$hex;
			}
			while( strlen($$hex) > 0 ) {
				$$ret = $$ret + "%" + leftstr( $$hex, 2 );
				$$hex = midstr( $$hex, 2 );
			}
		}
		##i = ##i + 1;
	}
	return $$ret;

(2011/11/16 文字列エンコード機能を追加)


複数行をコピーした場合は、どどんとふには一行ずつメッセージを送るように作成してみました。
たとえば

1行目
2行目

を送信すると

ななしさん:1行目
ななしさん:2行目

となります。


あとダイスボットを使う場合は

10R6 とにかく凄いロール&bot=ShadowRun4

とか、ちょっとカッコ悪いけど、文末でダイスボットを指定すれば、指定の通りにロールが可能です。


まー、どどんとふユーザ、かつ秀丸エディタユーザというターゲットがもの凄く狭いマクロですが。
いいの僕が使うから! あとマクロを作るのが楽しかったw


同様の原理で、Webページから送信、Excelから送信とかも可能なはずです。
どどんとふ、すげー、かっけー(めんま