2009年08月20日
ポイントカード

サーバーと連動して顧客情報を保存し、設定済みのポイントをお客様に加算し、しゃべるスクリプトをつくりました。
顧客が購入の瞬間にポイント加算処理を行う通常のpay方式のベンダーを最初は考えていたのですが、既存で店舗がある方が使おうとする場合、既存のベンダーを全て入れ替えなければなず、さらに新設のベンダーが既存のベンダーの機能と同等か、それを上回る機能を備えていなければならない、という事になりますから、それなら商品の初rezなり初装備の瞬間に一度だけポイント加算処理をするようにして、商品側にスクリプトを入れておけば良いのではないだろうか、という事で、rezまたは装備の瞬間に外部サーバーに問い合わせに行く様になっています。(それに、そうしておけばbuyでも動きますし・・・)
実際、ベテランの方お二人ほどに質問してみましたが、一人は
「ベンダー変えても良いよ?」
でしたが、もう一人は
「ありえへん」
でした。。。(笑
ですので、(安定して動くなら)既存店舗の改造が不要で、また、既存の優れたベンダー・サービスと並行して運用できるサービスを追加する為の要素、のような位置づけになっています。
モニターつまり実験台的に仕様を注文してくださる方を募集しています。何しろ自分でショップを経営したことがありませんので、どうすれば便利か、どうすればより面白いか、アイディアがありません。。^^;
仕様
1:rezの瞬間に初rezかどうかをチェックし、初でない場合(既にデーター登録済みの場合)はスクリプトを消して実行を終了します。この際、顧客(現在オーナー)の権限がコピー不可である場合は何度でも購入される商品と看做して商品のUUIDが登録されているかもチェックします。
2:商品情報データーベースから付加すべきポイントを拾い、加算した後に登録情報データーベースに書き込みます。全てのプロセスが成功すると、スクリプト自身を消して実行を終了します。
3:実行中に、実行開始と実行完了時点に話すべき内容をリストで指定できます。
4:セリフ内に置換文字列を入れると情報と入れ替えてから話します。
5:エラー発生時のセリフを指定でき、指定が無い場合は沈黙してこっそり処理します。
6:サーバーとの通信に失敗の際、オーナーにIMでサーバー不具合を通知してきます。
商品ごとにスクリプトに設定してやらなければならないのはサーバー上に保存した商品名(商品コード?)で、これに不一致があると誰かがrezするたびにオーナーにIMが飛んできます。
スクリプトカテゴリで何もスクリプト入らない記事が連続するのも何ですので、内部にあるセリフをしゃべる部分を。。
文字列
あいうえお{CUSTOMER_NAME}かきくけこ{CUSTOMER_NAME}さしすせそ
があったとして、{CUSTOMER_NAME}を置換するということは、一旦文字列を{CUSTOMER_NAME}で分割した後に、そのlistを置換すべき新しい文字で連結してやればよい事になります。
関数の呼び出しのコストがどのくらいなのかは不明ですが、便利物なのでphpの名前で関数化しました。
2009/11/3 追記
explodeとimplodeはlslに相当する関数がありました。
// www.lsleditor.org by Alphons van der Heijden (SL: Alphons Jano)
//セリフ
list l=["こんにちは{CUSTOMER_NAME}さん",
"このようになります。"];
string detectedName;
//explode(string セパレーター,string 文字列)
//http://search.net-newbie.com/php/function.explode.html
list explode(string sep,string src)
{
list res=[];
integer p=0;
integer sepLen=llStringLength(sep);
integer end=llStringLength(src)-1;
while (src!="")
{
p=llSubStringIndex(src,sep);
if (p<0) {
res+=[src];
src="";
}
else
{
if (p==0)
{
res+=[""];
}
else
{
res+=[llGetSubString(src,0,p-1)];
}
src=llGetSubString(src,p+sepLen,end);
if (src=="") res+=[""];
}
}
return res;
}
//implode(string セパレーター,string 文字列)
//http://search.net-newbie.com/php/function.implode.html
string implode(string sep,list src)
{
string res="";
integer max=llGetListLength(src);
integer i=0;
while(i<max)
{
res=res+llList2String(src,i)+sep;
i++;
}
res=llGetSubString(res,0,llStringLength(res)-llStringLength(sep)-1);
return res;
}
//str_replace(stirng 検索対象,string 置換内容,string 元の文字列)
//http://search.net-newbie.com/php/function.str-replace.html
string str_replace(string s,string r,string sub)
{
list res=explode(s,sub);
return implode(r,res);
}
//ownerSayByList(list せりふのリスト)
//リストに入っている文字列を順番にllOwnerSay()でしゃべる。
ownerSayByList(list l)
{
integer iMax=llGetListLength(l);
integer i=0;
while(i<iMax)
{
string s=llList2String(l,i);
s=str_replace("{CUSTOMER_NAME}",detectedName,s);
llOwnerSay(llBase64ToString(llStringToBase64(s)));
i++;
}
}
default
{
state_entry()
{
}
touch_start(integer total_number)
{
detectedName=llDetectedName(0);
ownerSayByList(l);
}
}
Posted by RBK Drachnyd(しお) at 13:08│Comments(3)
│Unauna-Umi
Comments
Posted by さゆり at 2009年08月20日 22:02
おそらく「ありえへん」と言った方は、私も知ってますがすごいベンダーを自作している、そして販売しているので。w
別ベンダーを使う意味がないってことだと思うよ。
私みたいな普通にオブジェクトで販売設定しかしない、
または買ってきたポーズベンダーしか使用しないなら、
使い勝手のいいものに変えるくらいなんでもないことだからね。
>さゆりさん
先日は不具合対応ありがとうございました。
偶然にも、しおちゃん(RBK)とはお友達でして、
ポイントシステムの話をはじめて聞いたときに、
さゆりさんのお店が外部システムでお客さんを管理してるよとLMを渡したのです。
あとで聞いたらすでに、そのときもう出会っていたとか。。
SLって狭いですね。w
しおちゃんとも話してたのですが、
私もシェイプやポーズが商品なのでオブジェクトじゃないわけで、
しかも、箱販売はしたくないという。。わがままw
だったら「ポイントカード」というオブジェクトを一緒に入れることで解決かなと。
一回装着すれば、スクリが消える仕組みのようなので使い終わったら捨てるですね。
別ベンダーを使う意味がないってことだと思うよ。
私みたいな普通にオブジェクトで販売設定しかしない、
または買ってきたポーズベンダーしか使用しないなら、
使い勝手のいいものに変えるくらいなんでもないことだからね。
>さゆりさん
先日は不具合対応ありがとうございました。
偶然にも、しおちゃん(RBK)とはお友達でして、
ポイントシステムの話をはじめて聞いたときに、
さゆりさんのお店が外部システムでお客さんを管理してるよとLMを渡したのです。
あとで聞いたらすでに、そのときもう出会っていたとか。。
SLって狭いですね。w
しおちゃんとも話してたのですが、
私もシェイプやポーズが商品なのでオブジェクトじゃないわけで、
しかも、箱販売はしたくないという。。わがままw
だったら「ポイントカード」というオブジェクトを一緒に入れることで解決かなと。
一回装着すれば、スクリが消える仕組みのようなので使い終わったら捨てるですね。
Posted by Lieza at 2009年08月21日 07:55
さゆりさん
いらっしゃいませー;_;/~
>スクリプト禁止の場所で箱をオープンされる方には、
>ポイントシステムは適用されない事になるのでしょうか?
その場合は権利発生が、次回別の場所でrezの時点に延期されます。
問題になりそうなのは、ポイントカードのスクリプトそのものに「編集」権限が与えられている場合ですね。。中にショップオーナーさんのアカウント情報を入れなければなりませんので、内容を読まれると、情報を抜かれてしまします。
次のオーナーが持ちうる権限を調べて、編集可能な場合には警告をしゃべるようにしておくほうがよいかもしれませんね。。
このスクリプトそのものは、もう少し考えてから、BLOGで公開するかもしれないです。
公開してセキュリティホールが出る様なものでは、実際には使えませんし。。^^;
Liezaさん
>一回装着すれば、スクリが消える仕組みのようなので使い終わったら捨てるですね。
そうですね。今思ったのですが、作業が正常に終わった時点で、自分を消すだけでなくて、プリム自体も消してもいいですね。アタッチされた場合は
「ポイントカードは、装備からはずして地面においてください。」
などしゃべることにして。。
どうも、ほとんどの場合コピー不可アイテムの中に入ることになりそうですし、そのほうが良い気がしてきました。
いらっしゃいませー;_;/~
>スクリプト禁止の場所で箱をオープンされる方には、
>ポイントシステムは適用されない事になるのでしょうか?
その場合は権利発生が、次回別の場所でrezの時点に延期されます。
問題になりそうなのは、ポイントカードのスクリプトそのものに「編集」権限が与えられている場合ですね。。中にショップオーナーさんのアカウント情報を入れなければなりませんので、内容を読まれると、情報を抜かれてしまします。
次のオーナーが持ちうる権限を調べて、編集可能な場合には警告をしゃべるようにしておくほうがよいかもしれませんね。。
このスクリプトそのものは、もう少し考えてから、BLOGで公開するかもしれないです。
公開してセキュリティホールが出る様なものでは、実際には使えませんし。。^^;
Liezaさん
>一回装着すれば、スクリが消える仕組みのようなので使い終わったら捨てるですね。
そうですね。今思ったのですが、作業が正常に終わった時点で、自分を消すだけでなくて、プリム自体も消してもいいですね。アタッチされた場合は
「ポイントカードは、装備からはずして地面においてください。」
などしゃべることにして。。
どうも、ほとんどの場合コピー不可アイテムの中に入ることになりそうですし、そのほうが良い気がしてきました。
Posted by RBK
at 2009年08月21日 20:11

私は既存商品が少ないのでベンダーを変えることもそれほど問題無いのですが(むしろ変更を検討中です!)
たくさん作ってらっしゃる方は大変ですよね><
RBKさんのお気遣いが素敵です❤
ひとつ疑問に思ったのは、洋服レイヤーだけで、オブジェクトが含まれない商品の場合はどうなるのでしょうか?
商品をつめた箱(?)にスクリプトを入れればいいかなとも思ったのですが、
スクリプト禁止の場所で箱をオープンされる方には、
ポイントシステムは適用されない事になるのでしょうか?
SLの事がよくわかっていなくてすみません><
今後の展開を楽しみにしています:-D