チャットルームでハンドル名取得No.00143
となりのニャンコ さん 98/12/18 12:37
 
となりのにゃんこです。
 お久しぶりです。
一つ前の発言を削除して申し訳ありませんでした。
質問しようと思った問題が解決しましたので削除しました。

そして問題がもう一つあります。
チャットルームで、変数@handle[1]に参加している人の
ハンドルネームを取得して、文章の末尾に貼り付けよう
というスクリプトができるはずだったのですが
つまり「うちの三毛」というハンドル名を取得したら
実行前  となりのニャンコ>こんにちは
実行後  となりのニャンコ>こんにちは>うちの三毛
ということができるようにしたいわけです。


先にきている人のハンドル名は最初に表示される一覧から取得できる
のですが、後からきた人のハンドル名が取得できないようなのです。
******
 Hi! となりのニャンコ です。
******
こんな感じで割り込んできます。
この「となりのニャンコ」の部分を取得したいのですが、
なかなかうまくいきません。

それと、このスクリプトを実行すると、チャット窓に書き込んだ文字を
送信するためには、どうしてもF7キーを押さなければ送信できません。
相手のハンドル名を付け加えないときは、文字を書き込んだ後「ENTER」
だけで送信するようにするにはどうしたらよいのでしょうか。

BBSは、フェリシモオンライン
ホストプログラムは、INTER-LINKです。
教えてください。
     よろしくお願いします。


Chatname:
keyassign f7, "チャットで名前", script ,Namesoshin
chat off
chat on
ime on
send "GO CHAT1" + "^M"           ;チャットルームへ行きます
timeout 3

wait"***チャット開始***"          ;先にきている人のハンドル名取得
@@dc=1
beginloop
readbuffer @@dc+2, @handle[@@dc]
if(part(@handle[@@dc],0,10 )=="利用者ID")breakloop
  if(part(@handle[@@dc],32,1)=="" or part(@handle[@@dc],32,1)==" ")breakloop
        @handle[@@dc]=part(@handle[@@dc],32,18)
@@dc=@@dc+1
endloop
@handle[@@dc]=""
timeout 0   ;先にきている人のハンドル名取得はここまで

ChatKaishi:                                   ;チャット中のメインスクリプト
setchatfilter Filter
sleep 1
goto ChatKaishi    ;チャット中のメインスクリプトここまで

Filter:                       ;新しい人が入ってきたらハンドル名を取得します
if (part(#1,0,8)!=" Hi! ")return
if (part(#1,0,24)=="***チャット終了***")
    nochatfilter
    exit
endif
@handle[@@dc]=part(#1,8,18)
@@dc=@@dc+1
return     ;新しい人が入ってきたらハンドル名ここまで

Namesoshin:               ;F7キーでチャット窓データ+ハンドル名を送信します
     getchat #chat
menu "名前なし",@handle[1],@handle[2],@handle[3],@handle[4],@handle[5],\
@handle[6],@handle[7],@handle[8],@handle[9],@handle[10]
switch result
case 0
     send #chat + "^M"
case 1
     send #chat + ">" + part(@handle[1],0,18) + "^M"
case 2
     send #chat + ">" + part(@handle[2],0,18) + "^M"
case 3
     send #chat + ">" + part(@handle[3],0,18) + "^M"
case 4
     send #chat + ">" + part(@handle[4],0,18) + "^M"
case 5
     send #chat + ">" + part(@handle[5],0,18) + "^M"
case 6
     send #chat + ">" + part(@handle[6],0,18) + "^M"
case 7
     send #chat + ">" + part(@handle[7],0,18) + "^M"
case 8
     send #chat + ">" + part(@handle[8],0,18) + "^M"
case 9
     send #chat + ">" + part(@handle[9],0,18) + "^M"
case 10
     send #chat + ">" + part(@handle[10],0,18) + "^M"
case -1
     send #chat + "^M"
endswitch
chat off
chat on
     goto ChatKaishi  ;F7キーでチャット窓データ+ハンドル名を送信ここまで

[ ]
RE:00143 チャットルームでハンドル名取得No.00144
となりのニャンコ さん 98/12/18 23:22
 
となりのにゃんこです。
自己レスです。

>setchatfilterコマンドは、チャットから文字列が入力されるたびに呼び出される
>サブルーチンを登録します。

と、スクリプトの文法に書いてあるので、チャット中に向こうから一行送られてくる
たびに、、サブルーチンへ飛ぶのだと思っていました。
 実は、チャットウインドウに書き込んでから「ENTER」キーを押すと、サブルーチ

へ飛ぶんですね。誤解でした。

143番の投稿をもう一度書きます。
ChatKaishi:                                   ;チャット中のメインスクリプト
setchatfilter Filter
sleep 1
goto ChatKaishi    ;チャット中のメインスクリプトここまで

Filter:                       ;新しい人が入ってきたらハンドル名を取得します
if (part(#1,0,8)!=" Hi! ")return
if (part(#1,0,24)=="***チャット終了***")
    nochatfilter
    exit
endif
@handle[@@dc]=part(#1,8,18)
@@dc=@@dc+1
return     ;新しい人が入ってきたらハンドル名ここまで

上が143番のスクリプトですが書き直したものをしたに表示します。

ChatKaishi:                            ;チャット中のメインスクリプト
millitimeout 100
wait " Hi! "
readbuffer 0, @c2
getline @c1
if(@c2 == " Hi! ")call Newhandle
millisleep 1
goto ChatKaishi    ;チャット中のメインスクリプトここまで
Newhandle:                     ;新しい人が入ってきたらハンドル名を取得します
if(@c2 != " Hi! ")return
@handle[@@cc]=@c1
             call Spacecut
@@cc=@@cc+1
return     ;新しい人が入ってきたらハンドル名ここまで
Spacecut:                      ;ハンドル名の後ろのよけいな空白を削除します
  if(part(@handle[@@cc],1,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,1)
  if(part(@handle[@@cc],2,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,2)
  if(part(@handle[@@cc],3,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,3)
  if(part(@handle[@@cc],4,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,4)
  if(part(@handle[@@cc],5,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,5)
  if(part(@handle[@@cc],6,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,6)
  if(part(@handle[@@cc],7,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,7)
  if(part(@handle[@@cc],8,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,8)
  if(part(@handle[@@cc],9,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,9)
  if(part(@handle[@@cc],10,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,10)
  if(part(@handle[@@cc],11,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,11)
  if(part(@handle[@@cc],12,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,12)
  if(part(@handle[@@cc],13,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,13)
  if(part(@handle[@@cc],14,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,14)
  if(part(@handle[@@cc],15,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,15)
  if(part(@handle[@@cc],16,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,16)
  if(part(@handle[@@cc],17,1)==" ")@handle[@@cc]=part(@handle[@@cc],0,17)
@handle[@@cc]=part(@handle[@@cc],0,18)
return     ;ハンドル名の後ろのよけいな空白を削除ここまで

このようにすると、後から入ってきた人のハンドル名を取得することができました。
******
 Hi! ニャンコ です。
******
という行からニャンコを取得するポイントは、
wait " Hi! "
readbuffer 0, @c2
getline @c1
でした。
readbufferは" Hi! "を取得し
getline は"ニャンコ です。"を取得するという特性を利用しました。

問題は解決したのですが、ご意見や、もっと賢いスクリプトがあれば教えてください。

[ ]
RE:00144 チャットルームでハンドル名取得No.00145
かずや さん 98/12/19 06:08
 
>問題は解決したのですが、ご意見や、もっと賢いスクリプトがあれば教えてください。
では、お節介ですが、お言葉に甘えてそうします(笑)

>ChatKaishi:                                   ;チャット中のメインスクリプト
>setchatfilter Filter
>sleep 1
>goto ChatKaishi    ;チャット中のメインスクリプトここまで
ここに SWITCH文などで受信文字列を処理するようにします。

例:
switch
case "Hi!"
  wait "^M"              ;1行読み込むまで待つ
  readbuffer 0,#buffer
  if(part(#buffer,0,8) == "Hi!") ;誤信のための2重チェック
    ;ここに新しいハンドルを取得したときの処理を記述
  endif
case ""    ;その他、自動挨拶など
  ・・・ 各処理を記述
endswitch

こうすると、ハンドル追加の処理と、ハンドル付加の処理を
別々にできて、管理しやすくなります

また、大抵のスクリプトでは、こういう風になっていると
思います(少なくともσ(^-^)のスクリプトでは これ(笑))

それで、filter は送信した場合のみなので
送信に関係することだけを書くようにしてみてはいかがですか?

お節介でした m(_ _)m

[ ]