記事一覧

共有変数プラグインを試してみた

共有変数プラグイン

SSP/2.2.42より標準添付された、ゴースト間共有変数処理用プラグインです。詳しくはreadme.txtを参照。

使ってみる

書き込み

readme.txtの41行目にOnSharedValueReadって書いてありますけどOnSharedValueWriteの間違いです。

{
  _pluginID = 'ABED14AF-F34B-4ff2-95B7-30ED37D5802D'

  _script = "\![raiseplugin,%(_pluginID),OnSharedValueWrite,きー,ばりゅー]"
  _script += '\0かきこみー\e'

  _script
}

readme.txtにもありますが、「ゴースト名」を指定することはできません。たぶんSenderを読んでるんだと思います(今回は「ごーすとじてん」)。別ゴースト領域への書き込みを防ぐための仕様のようです。

読み込み
{
  _pluginID = 'ABED14AF-F34B-4ff2-95B7-30ED37D5802D'

  _script = "\![raiseplugin,%(_pluginID),OnSharedValueRead,ごーすとじてん,きー,かー]\e"

  _script
}
OnSharedValueRead
{
  _script = '\0\_qごーすとじてんのでーた\n' + sys.fnc.ShowReference() + '\e'

  _script
}
sys.fnc.ShowReference
{
  _s = ''
  for _i = 0; _i < ARRAYSIZE(reference); _i++ {
    _s += "Reference%(_i): %(reference[_i])\n"
  }
  _s
}

//こんなresponseが返ってくる
//Reference0: ごーすとじてん
//Reference1: きー
//Reference2: ばりゅー
//Reference3: かー

先程保存した「きー」に対する「ばりゅー」が返ってきます。「かー」は存在しないので次のReferenceは空欄。これは他のGHOSTからも読めます(ていうかそのためのPLUGIN)。

リスト表示
{
  _pluginID = 'ABED14AF-F34B-4ff2-95B7-30ED37D5802D'

  _script = "\![raiseplugin,%(_pluginID),OnSharedValueGhostList]\e"

  _script
}
OnSharedValueGhostList
{
  _script = '\0\_q' + sys.fnc.ShowReference() + '\e'

  _script
}
sys.fnc.ShowReference
{
  _s = ''
  for _i = 0; _i < ARRAYSIZE(reference); _i++ {
    _s += "Reference%(_i): %(reference[_i])\n"
  }
  _s
}
//こんなresponseが返ってくる
//Reference0: ごーすとじてん

そのPLUGINを利用しているGHOSTのリストが返ってきます。

ちょっと意地悪をしてみる

SSPのタグを使わず直接PLUGINにrequestを投げてみます。

#define C_CRLF CHR(0xd)+CHR(0xa)

foo
{
  _dll_path = '..\..\..\..\plugin\shared_value\shared_value.dll'

  _r_load = LOADLIB(_dll_path)
  if _r_load == 0 {
    '\0失敗\e'
    return
  }
  //ホントはLOAD直後にversionをリクエストするのが流儀
  //だけど今回は省略

  _reqheader = "/
    GET PLUGIN/2.0%(C_CRLF)/
    Charset: UTF-8%(C_CRLF)/
    ID: OnSharedValueWrite%(C_CRLF)/
    Sender: AYA%(C_CRLF)/
    Reference0: hoge%(C_CRLF)/
    Reference1: fuga%(C_CRLF)/
    "
  _reqheader += C_CRLF

  _result = REQUESTLIB(_dll_path, _reqheader)//responseは 204 No Content

  UNLOADLIB(_dll_path)

  '\0書き込み完了\e'
}

YAYAはSAORIに限らず伺かのプロトコルなら何でも投げられます。今回はSenderをAYAとしたのでAYAさんの名前で保存されました。Senderを偽装ずれば他のGHOSTのデータを改竄できそう(やらないけど)。

何に使う?

YAYAから直接利用できたので当然他のPLUGINからも利用出来ます。ウチでも音楽再生PLUGINなどを公開していますが、再生リストを全てのGHOSTと共有可能にしてみるとか。音楽再生機能を持つGHOSTは数あれど、それぞれ登録し直さないといけないのも不便ですし。

…でもこれは全てのGHOSTに書き込み権限が無いと逆に不便ですね。もう少し色々考えてみようと思います。