CGI-BBS > チャット > 簡易チャット > 参加者のハンドル表示をIPアドレスで自動的に色分け


カレッヂ
カレッヂ


質問者 若秩父  投稿日 1/27(土) 09:25:59
minichatで、チャット中のメンバーのハンドルネーム表示色を、IPアドレスを参照して自動的に色分けする方法がありましたらご教授ください。

例)210.000.11.22→赤
  133.999.88.77→青
  204.???.??.??→緑
  その他は黒
回答者 まさ  [削除]  投稿日 1/27(土) 14:28:05
>210.000.11.22→赤
>133.999.88.77→青

回答ではないですが、こんなIPってありますか?
質問者 若秩父  [削除]  投稿日 1/27(土) 16:44:24
あくまでも「例」として考えていただければ幸いです。
説明不足でした。上記アドレスはたぶん実在しないと思います。

ついでなので補足をしておきますと、固定でないIPの場合の方が多いでしょうから、そうしたことも考慮していただければと思います。

引き続きよろしくお願いします。
回答者  [削除]  投稿日 1/27(土) 16:51:57
>210.000.11.22→赤
>133.999.88.77→青

>回答ではないですが、こんなIPってありますか?

ないです。
0〜255までの数値4つで
確か0と255は特別な意味を持っていて使えなかったと思います。


で、回答ですが
色分けは例えば管理人は赤、Aさんは緑、Bさんは白、Dさんは青…… というように
半永久的に決めておくものでしょうか。
それともチャットに入室するたびに振り分けるものでしょうか。

前者の場合だと同じパソコンからアクセスしてもIPアドレスは一定ではないので個人を特定することはできません。
後者の場合は退室チェックが大変です。
質問者 若秩父  [削除]  投稿日 1/27(土) 18:31:23
参加メンバーが小数で限られるチャットなので、固定されてる部分のみで判別できれば、と。
回答者 まさ  [削除]  投稿日 1/28(日) 18:41:37
まずIPアドレスで変動するのは4つ目のブロックなので前3つで判断するとします。
例えば
123.11.23.***
192.25.200.***
の2つの場合(IPアドレスは$ipに入っているものとする)

if    ($ip =~ /123.11.23/ ) { $ip_color=''; }
elsif ($ip =~ /192.25.200/) { $ip_color=''; }
else  { $ip_color=''; }

とし、あとはIPを表示しているところで、

print "$ip_color$ip
\n";

回答者 まさ  [削除]  投稿日 1/28(日) 18:44:07
すいません。タグが認識されますね。
適宜全角<>は半角に直して下さい。

まずIPアドレスで変動するのは4つ目のブロックなので前3つで判断するとします。
例えば
123.11.23.***
192.25.200.***
の2つの場合(IPアドレスは$ipに入っているものとする)

if    ($ip =~ /123.11.23/ ) { $ip_color='<font color="#ff00ee">'; }
elsif ($ip =~ /192.25.200/) { $ip_color='<font color="#88eeff">'; }
else  { $ip_color='<font color="#000000">'; }

とし、あとはIPを表示しているところで、

print "$ip_color$ip</font>\n";

質問者 若秩父  [削除]  投稿日 1/29(月) 08:50:35
回答いただきありがとうございました。

部分的にいくつかイジりました。
まず「
」を取り除き、あと($ip =~ /123.11.23/ )の箇所を($host ='~ /123.11.23/' )と「'」で囲んだらうまくいきました。
そうしたのはもちろん、「'」なしではダメだったようで、山勘で加えてみただけですが、ここいらの違いはサーバによっていろいろあるのでしょうかね?

ところが...

一時は歓声を上げたのですが、これも「ユーザーの好みに合わせてハンドルネームの色を変える」ですが、私が考えていたのは「ハンドル毎に色分けする」ということです。

つまり、まささんのおっしゃるようにすれば、

(Aさんの場合)          (Bさんの場合)
Cさん:うちは降りませんでした   Cさん:うちは降りませんでした
Aさん:すっかり溶けました     Aさん:すっかり溶けました
Bさん:雪は残ってますか?     Bさん:雪は残ってますか?
Aさん:こんにちわ         Aさん:こんにちわ

となりますが、私は

(A、B、Cさん共通の画面表示)
Cさん:うちは降りませんでした
Aさん:すっかり溶けました
Bさん:雪は残ってますか?
Aさん:こんにちわ

というのを希望しております。
誤解を招いてしまったようで申し訳ありませんでした。

引き続きよろしくおねがいします。
回答者  [削除]  投稿日 1/29(月) 11:16:30
まささんの方法でいいと思います。
どこで処理を行うかの問題です。

データファイルに書き込み処理のところに記述してみてください。
質問者 若秩父  [削除]  投稿日 1/29(月) 11:44:10
ごめんなさい、なんかこんがらがってきてます(^^;

羊さんのおっしゃることは、ifからのip設定をどこに置くか、ということですね?
具体的にその場所を教えていただければ幸いです(って教えてくれてるのですが、よくわかんないでいます)。

それと、<!-- $host -->の情報を、ログのソースを見ると、他の人の発言もすべて私のIPに書き変わっています。
むしろそのことで、設定した色が反映されてないのかも知れません。
話がずれてしまうようですがお許しください。

申し訳ありません。
回答者 しあわせのツボ  [削除]  投稿日 1/29(月) 13:16:29
バージョンはどれですか? とりあえず5.2を例にしますが、他のバージョンでも同様の所があると思います。
line 105
if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; }
の直後に
if ($addr =~ /^123\.11\.23/ ) { $ip_color='<font color="#ff00ee">'; }
elsif ($addr =~ /^192\.25\.200/) { $ip_color='<font color="#88eeff">'; }
else { $ip_color = '<font color="#000000">'; }
を追加し、
(まささんは$ipでチェックしていますが、レスキューさんのスクリプトではたいてい$addrになります)
line 108
push(@lines,"$date_now\t$FORM{'name'}\t$FORM{'chat'}\t$FORM{'email'}\t$host\n");

push(@lines,"$date_now\t$ip_color$FORM{'name'}</font>\t$FORM{'chat'}\t$FORM{'email'}\t$host\n");
に書き換えます。
※タグは適宜半角に直して下さい。
質問者 若秩父  [削除]  投稿日 1/29(月) 14:58:13
しあわせのツボさんのご指示通りにしてみました。
もしかしたらうまくいってるのかもしれませんが、ログにIP ADDRESSが残らなくなってしまってます。
ここを解決しないと確認のしようがなく困ってます。もはや自分でもどこをどうしたのか足取りを忘れてしまったのが痛いです。
こうなったら最初からやりなおすっきゃないですかね?

もう少しお時間をください。
もちろんその間もご指示があればおねがいします。
質問者 若秩父  [削除]  投稿日 1/30(火) 09:37:59
minichatのプレーンな状態から、とりあえずしあわせのツボさんの通りにやってみましたが、その前にやはり、発言者のIPがログに記録されないことで私は手こずっているのかもしれません。

新しいスレッドで、「minichatでIP表示をするには」というのを書いておきます。
まず、そちらから解決できればと思いますので、何卒ご協力ください。

余談:ちなみに今は、「minichatでIP表示をするには」で書いた通りにしてみて、とりあえずIPは記録されますが、最新の発言をした人のIPが他の人の発言の記録にも(IPのみ)上書きしてしまうというありさまです。
ですから、ハンドル名はその都度変化してしまいます。赤の人が発言したら全部赤、次に青の人が発言したら青...という具合に。

返信(回答)する


Web裏技