Download

akari.dll(ver2.003)

このプログラムを使用したいかなる不利益も作者は責任を負いません。
伺かのサブシステムとして使う場合に限り、無償で無制限に使用できます。

灯サンプルゴースト

akari.zip

最低限の機能のみが付いた、ゴーストの骨組みです。

灯サンプルゴースト2
「639C 灯花」

639c_tomoka.nar

<preview>

里々に似た形でトークを記述できるようにしたゴーストです。
普通のゴーストを作る場合はこちらを改変して作るほうが
やりやすいかもしれません。

灯テスター

akari_tester1.0.zip

灯スクリプトのテストに使えるプログラムです。
詳しくは中のreadme.txtを参照下さい。

スクリプト暗号化プログラム

amb.exe(ver1.1)

このプログラムを使用すると、スクリプトが一つのファイルに纏められて暗号化されます。

使い方
暗号化したいファイルを選択し、このプログラムに
ドラッグ&ドロップしてください。
プログラムが置かれているフォルダにmain.ambファイルが
作成されます。
このmain.ambを栞と同じフォルダに置いてください。
注意
・akari.dllと同じフォルダに、main.ambと一緒に暗号化されていないスクリプトファイルを置いた場合、
暗号化されていないファイルが優先されます。
・復号化は出来ませんので、スクリプトのバックアップは必ず取るようにしてください。

その他
_mousemove( int X座標, int Y座標 )
マウスカーソルを移動させます。
_mouseleftclick()
マウスカーソルのその時点での位置で左クリックします。
_mouserightclick()
マウスカーソルのその時点での位置で右クリックします。
_mousedoubleclick()
マウスカーソルのその時点での位置でダブルクリックします。
_openfileselect( string ダイアログのタイトル );
開くファイルを選択するダイアログが開かれます。
_savefileselect( string ダイアログのタイトル );
保存するファイルを指定するダイアログが開かれます。
array _colorselect( string ダイアログのタイトル );
色選択ダイアログボックスを表示します。
返る配列には赤緑青の順でRGBの各色の値が入っています。
string _folderselect( string タイトル, string デフォルトのフォルダー );
フォルダー選択用のダイアログボックスを表示します。
選択したフォルダの絶対パスが返ります。
_popmes( string 内容, string タイトル );
メッセージボックスを表示する。
デバッグなどに便利です。
_setfocus( int ハンドル値 );
指定したハンドル値のウィンドウにフォーカスを移します。
_file_execute( string ファイル名, string コマンドライン引数 );
ファイル名で指定したプログラムを実行します。
例えばexplorer.exeでCドライブを開くには以下のようになります。
_file_execute( "explorer.exe", "C:" );
※今のところ_create_thread関数で作成したスレッド内では使えません。
エンコード・デコード
string _urlencode( string 変換したい文字列, string code )
渡された文字列をURLエンコードして返します。
codeに文字コードを指定すると、文字列はその文字コードに変換されてからURLエンコードされます。
指定できるのはsjis,eucjp,utf8,jisのいずれかです。
省略時はsjisとなります。
string _urldecode( string 文字列, string code )
URLエンコード文字列をデコードします。
codeにはエンコードされている文字列の文字コードを指定します。
指定できるのはsjis,eucjp,utf8,jis,autoのいずれかです。
省略時はsjisとなります。
autoを指定すると自動判別されます。
(jsonで定義された型) _json2azv( string or array JSON形式データ )
JSON形式のデータを解析し、灯の変数に変換して返します。
配列を引数に指定した時は一旦すべての要素をつなげて
一つの文字列にしてから解析します。
string _azv2json( 変換したい変数 )
多次元の辞書型や配列型を含む全ての灯の変数をJSON形式の
文字列に変換して返します。
返される文字列は改行コードなどが入っています。

以下は_vsave,_vloadの代わりにJSON形式を使ってみる
サンプルスクリプトです。
// _vsaveの代わり。辞書型のみ対応。
json_save( string filename, dict d )
{
_writetext( filename, _azv2json( d ), "utf8" );
}
// _vloadの代わり。辞書型のみ対応。
dict json_load( string filename )
{
return _json2azv( _readtext( filename, "utf8" ) );
}

// 使用例
main()
{
dict td =
$("test",
{
${ $("test1", "testvalue1"),
$("test2", {1,2,3} )
},
${ $("test1", "testvalue1"),
$("test2", ${
$("test1", "testvalue1"),
$("test2", {1,2,3} )
}
)
}
}
);
// tdを保存してみる。
json_save( "testfile.txt", td );
// 保存したtdを読み込んで灯の辞書型に変換し、また別の名前で保存してみる。
json_save( "testfile2.txt", json_load( "testfile.txt" ) );

return;
}
string _base64encode( string 変換したい文字列 );
文字列をbase64でエンコードして返します。
string _base64decode( string 変換したい文字列 );
base64の文字列をデコードして返します。
string _md5( string 文字列 )
文字列のMD5値を作成します。
string _filemd5( string ファイル名 )
ファイル名で指定したファイルのMD5値を作成します。
array _tokenize( string ファイル名 );
ファイル内の文字列を、トークンごとに分割して返します。
灯が内部でスクリプト読み込み時に使っているトークナイザーを流用しており、
//から行末までの文字列や、/*と*/に囲まれた複数行の文字列などの
C言語形式のコメントは読み飛ばされます。
array _strtokenize( string 文字列 )
指定された文字列をトークンごとに分割します。
分割のされ方は_tokenizeと同じです。
スレッド関連
long _create_thread( string 関数名, 関数に渡す引数1, 引数2, ... )
新たにスレッドを作成し、関数名で指定した関数をそのスレッド上で実行します。
_sleep( double 秒 )
処理を休みます。
作成したスレッドで長い間繰り返されるループを処理させる時などに使ってください。
データベース
int _dbopen( string DB名 );
SQLiteを使ってデータベースを開く。
DB名に指定したファイルがなかったら作成されます。
DBはひとつしか作れません。
array _dbquery( string クエリ文 );
_dbopenで開いたDBに対してクエリを実行。
返り値には{"列名:値", "列名:値", ...}という形の配列が返るはず。
array _dbclose();
開いているDBを閉じる。
_dbcsv2table( string CSVファイル, string テーブル名, array テーブル各列の型, int 1列目にidという名前の行を作るかどうか )
灯テスターを含めたサンプル一式を置いておきます。
http://le.silk.to/dl/sample1221.zip
第3引数のテーブル各列の型を省略するとすべての列はtext型になります。
第4引数も省略可能。trueにすると最初の列にidという列が追加されます。
このidという列は整数型の主キーでNULLを許可せず、自動インクリメントです。
(id integer primary key not null)~
ファイル操作・入出力
long _vsave( string 拡張子のないファイル名, 保存する変数 )
変数を保存します。
複雑に多次元化したarrayやdict型変数も保存できます。
保存した変数 _vload( string 拡張子のないファイル名 )
変数を読み込みます。
array(string) _readtext( string ファイル名, string 文字コード, string 改行コード )
テキストファイルを1行毎に分割した配列にして読み込みます。
ファイル名には絶対パスと相対パスを使えます。
文字コードにはsjis,utf8,eucjp,jis,autoのいずれかを指定できます。
autoを指定すると文字コードを自動判別します。
改行コードにはcrlf,lf,noneのいずれかを指定できます。
省略時はcrlfになり、noneが指定されると配列ではなく文字列が返ります。
noneの指定によって返される文字列は改行コードも含んでいます。
int _writetext( string ファイル名, array 内容, string 文字コード, string 改行コード )
配列をテキストとして保存します。
文字コードにはsjis,utf8,eucjp,jis,autoのいずれかを指定できます。
改行コードにはcrlfかlfを指定します。省略時はcrlfです。
int _fcopy( string 元ファイル名, string コピー先ファイル名 )
元ファイル名とコピー先ファイル名には相対パスか絶対パスでファイルを指定します。
例えば以下のように。
_fcopy( "test.txt", "test2.txt" );
_fcopy( _openfileselect(), _savefileselect() );
int _fmove( string 元ファイル名, string コピー先ファイル名 )
元ファイル名とコピー先ファイル名には相対パスか絶対パスでファイルを指定します。
ファイル名の変更にも使えます。
int _fdelete( string 対象ファイル名 );
ファイルを削除します。
相対パスか絶対パスを指定できます。
int _dcreate( string 作成フォルダ名 );
フォルダを作成します。
作成するフォルダ名には相対パスか絶対パスを指定できます。
int _ddelete( string 削除対象フォルダ名 );
フォルダを削除します。
中身も全部消えます。
相対パスか絶対パスを指定できます。
int _dcopy( string 元フォルダ名, string コピー先フォルダ名 )
フォルダをコピーします。
中身も全部コピーされます。
相対パスか絶対パスを指定できます。
int _isfile( string フォルダパスorファイルパス )
ファイル、もしくはフォルダの存在を確認します。
存在すれば1、しなければ0が返ります。
dict _fenum( string フォルダーパス )
指定したフォルダー内のフォルダ名、ファイル名の一覧を返します。
返値の辞書には「folder」というキーにフォルダ名の配列。
「file」というキーにファイル名の配列が入っています。
string _abspath( string ファイルの相対パス );
相対パスのファイルを絶対パスにします。
test.txtを入れると、C:userunDesktop est.txtみたいなパスになります。
array _readcsv( string CSVファイル名, string 文字コード);
CSVファイルを読み込むことが出来ます。
返値は2次元の配列となっています。
ファイル名は絶対パス、相対パスのいずれも指定可能。
CSVファイルがsjis以外の文字コードである場合は第2引数で文字コードを指定して下さい。
eucjp,utf8,sjis,jisが指定出来、省略時はsjisです。
int _savecsv( string ファイル名, array 対象配列, string 文字コード);
2次元の配列をCSV形式で保存します。
ファイル名は絶対パス、相対パスのいずれも指定可能。
指定した文字コードで指定することが出来ます。
eucjp,utf8,sjis,jisが指定出来、省略時はsjisです。
変数操作
dict _dicv( string キー, 値 )
キーと値からなる要素を一つもった辞書を作ります。
$( string, value )と同じなので、使うことはないかもしれません。
array _dickeyget( dict 辞書 )
辞書のキーを全て取得します。
array _dicvget( dict 辞書 )
辞書の値を全て取得します。
long _dicvn( dict 辞書 )
辞書の要素数を返します。
long _aryvn( array 配列 )
配列の要素数を返します。
string _randselect( 配列一個か複数の引数 )
配列や複数の引数の中から一つ選んで返します。
string _gettype( 変数 )
変数の型によってlong,double,string,array,dict,nilのいずれかが返ります。
返値 _fncstr( string 関数名, 引数1, 引数2, ... )
関数名を文字列で指定して実行します。
返値は指定した関数の返値です。
array _strary( string 変換したい文字列 )
文字列を一文字ごとに格納した配列を返します。
string _arystr( array 変換したい配列 )
配列を全部つなげて文字列にして返します。
int _strlen( string 文字列 )
文字列の長さを返します。
int _strstr( string 検索対象文字列, string 検索文字列, int 検索開始位置 )
検索対象文字列の中で検索文字列の位置を返します。
検索開始位置から検索が開始されます。省略すると最初からになります。
文字列が見つからないときは-1が返ります。
string _substr( string 対象文字列, int 開始位置, int 文字数 )
対象文字列から文字列を切り取ります。
array _strsplit( string 対象文字列, string 分割に使う文字列 )
対象文字列を文字列で分割します。
long _regex_match( string 対象文字列, string 正規表現 )
対象文字列が正規表現と合致すれば1が返ります。
[0]に正規表現に合致した文字列が入ります。
それ以降は正規表現の()のグループに合致した値です。
順番には何番目に合致した物を返すかを指定します。
順番を省略すれば最初に合致した物が返ります。
string _regex_replace( string 対象文字列, string 正規表現, string 置換する文字列 )
置換対象文字列から、正規表現に合致した文字列を置換する文字列に置き換えた文字列を返します。
string _strreplace( string 対象文字列, string 検索文字列, string 置換文字列 )
対象文字列の中にある検索文字列をすべて置換文字列で置き換えます。
long _rand()
0~9999のいずれかの整数が返ります。
string _bytechar( long 値 )
バイト値が入った文字列を返します。
この関数の返値を含む文字列をゴーストに喋らせようとしたとき、
値によっては意図しない動きになることがあるので注意が必要です。
string _zen2han( string )
アルファベットや記号などの全角文字を半角にして返します。
string _han2zen( string )
アルファベットや記号などの半角文字を全角にして返します。
string(or array) _sprintf( string(or array) format, 値, ... );
C言語のsprintfとほぼ同じです。
第一引数に配列を入れると、返る値も配列となります。
配列を指定すると、書式化文字列が異なる行に散らばっていても
順番に値を入れられます。

// 配列を使った例。
// ファイルの中の書式化文字列を値に置き換えます。
_savetext( "test.txt", _sprintf( _readtext("test.txt"), "test1", "test2" ) );

// C言語のsprintfとは引数順の扱いがちょっと違います。
// 例えば以下は書式化文字列の数と値の数が一致しませんが、意図する通りに動きます
_sprintf( "となりの%sはよく%sくう%1$sだ", "きゃく", "かき" );
情報取得
string _getghosthwnd( string sakura側ゴースト名 );
他のデスクトップ上に立っているゴーストのsakura側のウィンドウハンドルを取得します。
指定する名前はゴースト名ではなく、sakura側の名前です。
dict _gettime()
返される辞書には 年、月、日、時、分、秒、ミリ秒、週 というキーに値が入っています。
週だけ文字列で他は整数です。
int _keystate( string(or int) 仮想キーコード );
指定したキーが押されているかどうかを返します。
キーの指定は仮想キーコードで行います。
仮想キーコードについては以下のページに詳しく記載されています。
http://wisdom.sakura.ne.jp/system/winapi/win32/win32.html
(WisdomSoft様のページ)
例えばキーボードの↑が押されているかどうかを調べるには以下のように書きます。
_keystate("VK_UP");
キーボードの「A」などが押されているかを調べるには、その文字のキーコードを指定します。
例えば「A」が押されているかを調べるには以下のようになります。
_keystate(65);
dict _joypadstate();
ジョイパッドの入力状態の格納された辞書型の値が返ります。
up,down,right,left,button0~7のキーに、それぞれボタンが押されていたら1、そうでなければ0が入ります。
dict _mousepos();
マウスカーソルの現在の位置を取得します。
辞書型の値が返り、"x"に横座標、"y"に縦座標が入っています。
_getposwindowname( int x, int y );
指定した座標の下のウィンドウ名を取得する。
_update_windowslist();
内部に保持しているWindow名=>Handle値のリストを更新する。
_get_windowslistを実行する前などに実行するといいかもしれない。
dict _get_windowslist();
ウィンドウ名=>Handle値の形式で辞書型の値が返る。
array _getfmo()
SakuraFMOを取得します。

ごとに分割され、配列に入れられたものが返ります。
byte値の1はそのままなので、これを分割する時は_bytechar関数と
_split関数を使って下さい。
FMOというのはプログラムが他のプログラムと情報を
共有しあうための仕組みで、SSPやmateriaはsakuraという名前の
FMOを起動中に保持しています。
以下のスクリプトを実行すると中を見ることが出来ます。
_writetext( "fmo.txt", _getfmo() );
int _etime( int year, int month, int day, int hour, int minute, int second )
渡された日付時刻を歴時刻に変換します。
年、月をまたぐ日数の計算などに使用出来ます。
引数を全て省略すると現在時刻の歴時刻が返されます。
string _version()
灯のバージョンを返します。
以下のような文字列が返ります。
1.976
数学
_pow( double, double );
べき乗
_fabs( double );
絶対値
_sqrt( double );
平方根
_hypot( double, double );
二乗を足したものの平方根
_sin( double );
三角関数
_cos( double );
三角関数
_tan( double );
三角関数
_asin( double );
三角関数
_acos( double );
三角関数
_atan( double );
三角関数
_atan2( double, double );
三角関数
_sinh( double );
三角関数
_cosh( double );
三角関数
_tanh( double );
三角関数
_exp( double );
指数・対数関数
_log( double );
指数・対数関数
_log10( double );
指数・対数関数
_floor( double );
切り捨て整数化
機能拡張
long _script_load( string 拡張子を除いたスクリプトファイル名 )
スクリプトを読み込みます。
引数に.azrを付けた名前のファイルを探します。
long _saoriload( string ファイルパス, string ID )
さおりを読み込みます。
IDには読み込んださおりを識別するための名前を指定します。
IDはメモリーに読み込んでおかねばならないuniversalさおりを使う時に指定します。
basicさおりの場合は指定する必要はありません。
long _saoriunload( string ID )
_saoriload関数で読み込んださおりを破棄します。
IDには_saoriload関数で指定したIDを入れます。
dict _saorirequest( string ファイルパスorID, 引数1, 引数2, ... )
さおりを実行します。引数1~はさおりに渡す引数です。
basicさおりも実行できます。
返値はさおりからの返値を辞書型に分解したものです。
例えば「こんにちは」という文字列を返すだけの「test.exe」というbasicさおりを
akari.dllと同じフォルダに置いているとすると、
_saorirequest( "test.exe" )["Result"]
と書けば「こんにちは」という文字列を取得できます。
第一引数がファイルパスで、そのさおりがuniversalさおりである時、loadとunloadが存在するなら
この関数の最初と最後でloadとunloadが処理されます。
通信
_speak( string 喋る文字列 )
OwnedSSTPを使ってゴーストに喋らせます。
_cdsscontrol( long true_or_false )
falseを入れると_speak関数が無効になり、trueを入れると有効になります。
_dsstp( array リクエスト文を1行毎に分割した配列, int 対象のウィンドウハンドル );
DirectSSTPで他のウィンドウに文字列を送信できます。
例えば以下のspeak2関数は_speak関数と同じ働きをします。
speak2( string s )
{
array request;
request += "SEND SSTP/1.4";
request += "Sender: akari";
request += "ID: "+_systemdict["uniqueid"]["Reference0"];
request += "HWnd: "+_systemdict["hwnd"]["Reference0"];
request += "Charset: Shift_JIS";
request += "Script: "+s;
request += "";
request += "";
_dsstp( request, _systemdict["hwnd"]["Reference0"] );
}
long _serial_open( long ポートナンバー )
シリアル通信に関する初期化を行います。
ポートナンバーには、例えばCOM1を使うなら1を指定します。
long _serial_setstate( dict 設定 )
引数はDCB構造体のメンバ変数名をキーとした辞書です。
string _serial_read()
シリアルポートのバッファ内にある文字列を返します。
long _serial_send( string 送信文字列 )
シリアルポートの送信バッファに文字列を入れます。
long _serial_close()
シリアルポートを閉じます。
array _httpget( string URL, string 文字コード );
URLで指定したファイルを取得します。
テキストファイル以外は扱えません。
文字コードにはsjis,eucjp,utf8,jisのいずれかを指定できます。
テキストファイルは各行ごとに分解され、配列で返されます。
int _http_download( string URL, string ファイル名 );
URLで指定したファイルをダウンロードします。
絶対パスか相対パスで指定したファイルとしてローカルに保存されます。
_ftp_login( string サーバー名, string ユーザー名, string パス, int ポート番号 )
FTPサーバーに接続します。
ポート番号は省略すると21になります。
_ftp_logout()
接続中のFTPサーバーからログアウトします。
_ftp_upload( string アップするファイル名, string アップロード先のファイル名 )
アップロードします。
string _ftp_command( string コマンド )
FTPコマンドを接続中のFTPサーバーに送信します。
ディレクトリを作成したり、ファイルを削除したりすることが出来ます。
_ftp_download( string ダウンロードするファイル名, string ローカルのファイル名 )
ダウンロードします。
dict _mailget( string メールサーバ, string メールアドレス, string パスワード, int 取得するメールの番号, int 接続に使うポート );
メールをひとつ取り出します。
取得するメールの番号を省略するか0を指定すると最新のものを取得。
接続に使うポートを省略すすと110番が使われます。
返される辞書型の変数には以下のキーでメールの内容が格納されています。
boxsize : メールボックス内のメールの数(int)
content : メールの本文が1行ごとに分けられた配列(array)
date : 受信した日付。「2012/12/17 12:10:11」のような形になっています。(string)
sender : 送信者のアドレス
int _mail_send( string ホスト名, string fromメールアドレス, string toメールアドレス, string 件名, string 内容, int ポート番号, string 認証タイプ, string ユーザー名, string パス );
メールを送信します。
認証タイプにはAUTH_NONE, AUTH_CRAM_MD5, AUTH_CRAM_SHA1, AUTH_LOGIN, AUTH_PLAIN
のいずれかが指定できます。
array _mailids( string ホスト名, string ユーザー名, string パス );
サーバー上でメールに付けられているIDを取得します。
maildelete( int ID )
IDで指定したメールを削除します。
内部関数以外の機能
イベント辞書変数
_eventdictという変数の中にイベント名をキーとした値を入れておくと、関数を呼ぶこと無く本体にその値を返します。
以下はダブルクリック時に「ダブルクリックされました」と返すように設定しています。
 _eventdict += $("OnMouseDoubleClick", "ダブルクリックされました");
システム辞書変数
本体からの通知イベントによって渡されるリクエストが辞書型に整形されて格納されています。
灯自体も参照したりするので、書き換えると動作がおかしくなることがあります。
例えば_systemdict["hwnd"]["Reference0"]の値を変更すると、_speak関数が使えなくなったりします。
_customrequest関数
スクリプト内に_customrequestという名前の関数を定義しておくと、本体からのイベントはその関数に渡されるようになります。
返り値の型はarray、関数名は_customrequest、引数はdict型にする必要があります。
以下の_customrequest関数は、ゴーストが_customrequest関数が定義されていない時と同じ動きをする関数です。

array _customrequest( dict ref )
{
    string  s   =   _eventdict[ ref["ID"] ];
    if( s == "" )   s	= _fncstr( ref["ID"], ref );
	
	array	ar;
	ar	+=	"SHIORI/3.0 200 OK";
	ar	+=	"Sender: akari";
	ar	+=	"Charset: Shift_JIS";
	ar	+=	"Value: "+s;
	ar	+=	"";
	ar	+=	"";
	
	return ar;
}

この関数を以下のように使うと、灯をSAORIとして使用することが出来ます。

array _customrequest( dict ref )
{
	array	ar;
	if( _strstr(ref["head"],"SAORI") != -1 )
	{
		ar	+=	"SAORI/1.0 200 OK";
		ar	+=	"Sender: akari";
		ar	+=	"Value0: "+ref["Argument0"];
		ar	+=	"Charset: Shift_JIS";
		ar	+=	"";
		ar	+=	"";
	}
	else
	{
		ar	+=	"SAORI/1.0 400 Bad Request";
		ar	+=	"Sender: akari";
		ar	+=	"Charset: Shift_JIS";
		ar	+=	"";
		ar	+=	"";
	}
	return ar;
}
メモ
ツキヨタケとの連携
ua栞「ツキヨタケ」でSAORIのようなものとして~
読み込む方法。

■tkytk_shioriフォルダ内にakari.dllとmail.azrを置く。
 main.azrには以下のスクリプトを書いておきます。
 灯のバージョンを返す簡単な関数です。
 _lua_requestはluaから呼ぶことが出来る関数です。
 引数は文字列型一つ、返り値は文字列型です。

string _lua_request( string test )
{
	return test + _version();
}

■ツキヨタケの初期化時に呼ばれる関数、「shiori_init()」の中に以下のスクリプトを書きます。

	package.cpath = package.cpath..";"..SHIORI_PATH.."?.dll"
	akari	= require( "akari" )
	akari.load( SHIORI_PATH ) -- 灯の場所を灯に教えています。

※package.cpathは、luaが拡張DLLを探す時に使われるパスのリストです。

■ツキヨタケの終了時に呼ばれる関数、「shiori_uninit()」に以下の関数を書きます。
	akari.unload()


■ダブルクリック時に実行されるように、index.lua内の「OnMouseDoubleClick」関数を以下のように変更してみます。
 requestという名前の関数は、灯スクリプト内の_lua_requestに対応しています。

function OnMouseDoubleClick(tbl)
	return akari.request("akari.dllのバージョンは")
end
Unicode対応について
灯はVer 2.00からUnicodeに対応しています。
具体的な変更点は以下になります。
・「.azr」という拡張子のスクリプトファイルは全てUTF-8という文字コードで読み込まれるように。
・_httpgetの第二引数、_readtextの第二引数、_writetextの第三引数で"utf8"を指定すると、UTF-8で読み込まれるように。
 (今までは一旦Shift_JISに変換されていた)
・ベースウェアへのレスポンスをCharaset: UTF-8で返すように。

※_httpget、_readtext、_writetextといった外部のファイルを扱う関数について、
文字コードを指定しない場合は今までどおりShift_JISとして読もうとするので、utf8を指定するようにして下さい。