チャットの人数を制限するためには?

[上に] [前に] [次に]
みかん [E-Mail] 2000/03/26(日) 15:30:12
2ショットチャットというのはよく見掛けるのですが・・・
2人ではなく、もっと大人数でのチャットの
利用人数の制限はできませんか?

例えば、4人とか、6人とか。
それだけ入ったら、チャットが、2ショットチャットの様に
自動的にロックされて、入れなくなるようなチャットは
どの様にすれば作れるのでしょうか?

使いたいのは、KENTの「COMCHAT-EX」です。
http://www.kent-web.com/chat/comchatx.html

よろしくお願いします m(_ _)m

以前、どこかで、4人制限のチャットを見掛けたのですが、
どこで見掛けたのか分からなく成ってしまい、フリーのソースで
できないだろうか?と思うに至りました。

てきとー 2000/03/26(日) 23:59:16
KENTさんの「COMCHAT-EX」は参加者人数をカウントしてますから、それを使って制限すればOKです。

みかん 2000/03/27(月) 10:03:36
>KENTさんの「COMCHAT-EX」は参加者人数をカウントしてますから、
>それを使って制限すればOKです。

済みません、チャットの改造は初めての経験なので、
どこをどう改造すれ良いのか全く
見当も付きません。お手数をお掛けしますが、
具体的にどのようにしたら良いのか
教えてください。よろしくお願いします m(_ _)m

むぅす 2000/03/27(月) 15:02:05
>&decode;
>if ($denykey) { &deny; }
>if (!$buffer) { &frame; }
>if ($mode eq 'form') { &form1; }
>if ($mode eq 'into') { &form2; }
>if ($comment && $mode eq 'msg') { &regist; }
>if ($mode eq 'bye') { &byebye; }
>&log_view;

$check = '4';制限する人数
&member
&decode;
if ($denykey) { &deny; }
if (!$buffer) { &frame; }
if ($num gt '$check'){
&header
print "制限人数、$check\人を超えている為、参加出来ません。\n";
print "</body></html>\n";
exit;
}else{
if ($mode eq 'form') { &form1; }
if ($mode eq 'into') { &form2; }
}
if ($comment && $mode eq 'msg') { &regist; }
if ($mode eq 'bye') { &byebye; }
&log_view;

おそらくこれで良いかと

むぅす 2000/03/27(月) 15:13:12
>#-----------------------#
>#  フォーム1 : 入室画面 #
>#-----------------------#
>
>sub form1 {
># クッキーを取得
>&get_cookie;
>
># HTMLを出力
>&header;
>print <<"EOM";
>(処理、中略)
> print "</body></html>\n";
> exit;
>}

sub form1 {
# クッキーを取得
&get_cookie;

$check = '4';#制限する人数

# HTMLを出力
&header;
&member;
if ($num gt '$check'){
print "制限人数、$check\人を超えている為、参加出来ません。\n";
print "</body></html>\n";
exit;
}else{
print <<"EOM";
(処理、中略)
print "</body></html>\n";
exit;
}
}

前発言は間違いです。
失礼しました、こうです。

むぅす 2000/03/27(月) 15:15:28
間違い間違い(汗)
>if ($num gt '$check'){
if ($num gt "$check"){

みかん 2000/03/27(月) 19:40:19
早速のレスをありがとうございます。

>sub form1 {
># クッキーを取得
>&get_cookie;
>
>$check = '4';#制限する人数
>
># HTMLを出力
>&header;
>&member;
>if ($num gt "$check"){
>print "制限人数、$check\人を超えている為、参加出来ません。\n";
>print "</body></html>\n";
>exit;
>}else{
>print <<"EOM";
>(処理、中略)
>print "</body></html>\n";
>exit;
>}
>}

以上のむぅすさんのプログラムを組み込んだのですが、
フォーム1が真っ白になってしまいました(;;)

フォーム1に
表示されているHTMLは

<html>
<head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=x-sjis">
<title>CHAT ROOM</title></head>

の以上です。

むぅす 2000/03/27(月) 20:26:01
う〜ん、下記をコピー&ペーストしてみて下さい。


sub form1 {
# クッキーを取得
&get_cookie;

$check = '4';#制限する人数

# HTMLを出力
&header;
&member;
if ($num gt "$check"){
>print "</head><body>\n";#忘れてました(^^;
print "制限人数、$check\人を超えている為、参加出来ません。\n";
print "</body></html>\n";
exit;
}else{
print <<"EOM";
</head>
$body
<form method="$method" action="$script" target="form" name="entry">
<input type=hidden name=mode value="into">
<a href="$homepage" target="_top">$backtag</a>
<center>$titletag</center><hr>
<table border=0 cellspacing=0>
<tr><td><font face="MS ゴシック">
<b>おなまえ</b> <input type=text name=name size=25 value="$c_name"><br>
<b>Eメール</b> <input type=text name=email size=25 value="$c_email"><br>
自動リロード <select name=retime>
EOM
if ($c_retime eq "") { $c_retime = $re_sec; }
foreach (0 .. $#reload) {
if ($c_retime eq "$reload[$_]") {
print "<option value=\"$reload[$_]\" selected>$reload[$_]秒\n";
} else {
print "<option value=\"$reload[$_]\">$reload[$_]秒\n";
}
}

print "</select></font><input type=submit value=\"入室する\"></td>\n";
print "<td width='40'><br></td>\n";
print "<td align='center' nowrap>文字色を選んでください<br>\n";

if ($c_color eq "") { $c_color = $COLORS[0]; }
$i = 0;
$key = @COLORS;
$key = $key/2 + 1;
foreach (0 .. $#COLORS) {
$i++;
if ($i == $key) { print "<br>"; }

if ($c_color eq "$COLORS[$_]") {
  print "<input type=radio name=color value=$COLORS[$_] checked>";
  print "<font color=$COLORS[$_]>■</font>\n";

} else {
  print "<input type=radio name=color value=$COLORS[$_]>";
  print "<font color=$COLORS[$_]>■</font>\n";
}
}

print "</td></tr></table></form>\n";
print "<SCRIPT LANGUAGE=\"JavaScript\">\n<!--\n";
print "self.document.entry.name.focus();\n";
print "//-->\n</SCRIPT>\n";
print "</body></html>\n";
exit;
}
}

むぅす 2000/03/27(月) 20:39:26
念の為、こちらでテストしました所
正常に動作しましたので
上記で良いと思います。

みかん 2000/03/27(月) 23:21:53
お早い対応をありがとうございます。

上のソースをペーストしたところ、
キチンと表示されるようになりました。

ただ、人数を制限できているのか、
設置をする前にチェックをしたいと思うのですが・・・・
チャットを設置した同ページを同時に複数起動させ、
同時に入ってみたのですが、何人でも入り込めてしまいます。

やはりプログラムは
「同じ串=同じ人物」と判断してしまうのでしょうか?
人数制限の機能が動いていることをチェックをするには、
どうすれば良いのでしょうか?

やはり、複数の串を使い分けない事には無理ですか?
(プロクシーとか?持ってないんです(;;)
・・どこに有るのかもよく分からないし・・・・)

済みません、物凄く馬鹿なことを
聞いているような気がします・・・・(^^;)

みかん 2000/03/27(月) 23:24:38
>ただ、人数を制限できているのか、
>設置をする前にチェックをしたいと思うのですが・・・・

ちょっと分かりづらい文章で済みません。
ここの「設置をする前」にの、「設置」っていうのは、
サイトにリンクを貼って利用者さんが使えるようにすることです。

むぅす 2000/03/27(月) 23:55:46
>チャットを設置した同ページを同時に複数起動させ、
>同時に入ってみたのですが、何人でも入り込めてしまいます。
>やはりプログラムは
>「同じ串=同じ人物」と判断してしまうのでしょうか?

IPアドレスで判断していますので、その様になりますね。

>人数制限の機能が動いていることをチェックをするには、
>どうすれば良いのでしょうか?

人数制限を0人にすれば
1人目(みかんさんがアクセスされた時点)で制限がかかりますので
人数制限が動作している事を確認出来ます。

みかん 2000/03/28(火) 10:26:48
いつもレスをありがとうございますm(_ _)m
お陰さまで、制限のチェックをすることが出来ました。

ただ、一つ気に成ることが・・・・・

チャットへ表示される参加者人数の事なんですが、
ただチェックの為に、チャットを覗いているのだけなのに、
カウントが(1)となってしまいます。
同じチャットの窓を2つ開いていると、(2)となってしまいます。

どうも、閲覧者まで一緒にカウントしてしまっているようなのですが、
これはどのように対処したらよろしいのでしょうか?

よろしくお願い致します m(_ _)m

むぅす 2000/03/28(火) 17:19:25
>どうも、閲覧者まで一緒にカウントしてしまっているようなのですが、
>これはどのように対処したらよろしいのでしょうか?

そういう仕様になってましたね(^^;

$name に値が入っているか否かで判断する様にしたいと思います。

>#----------------#
>#  デコード処理  #
>#----------------#

>    if ($name eq "") { $name = $host; }
閲覧者は、下フレームリロード時に$nameにIPアドレスが入ってしまう為、削除する

>#--------------#
>#  在室者処理  #
>#--------------#

> # ファイル更新
> if ($mode) {
> open(OUT,">$memfile") || &error("Write Error : $memfile");
> eval "flock(OUT,2);";
> truncate(OUT,0);
> seek(OUT,0,0);
> print OUT @new;
> close(OUT);
> }
>}
# ファイル更新
if ($name eq ""){
}elsif ($mode) {
open(OUT,">$memfile") || &error("Write Error : $memfile");
eval "flock(OUT,2);";
truncate(OUT,0);
seek(OUT,0,0);
print OUT @new;
close(OUT);
}
}

名無しさん用、エラー表示
>#----------------------------#
>#  フォーム2 : 発言フォーム  #
>#----------------------------#
の下に
sub form2 {
    if ($name eq "") {
&header;
print "</head><body>\n";
print "名前が入力されていません。\n";
print "</body></html>\n";
exit;
}
を追記します。

S-pore [HomePage] 2000/03/28(火) 21:47:19
かなりどうでもいいことかもしれなくて恐縮なのですが・・・。(^^;

> if ($num gt "$check"){

数値をわざわざ文字列比較しているのは何か意味があるのでしょうか?(高速化のためとか)
私も昔は == や != に限り,数値でも eq や ne を使ってましたが
(多少速くても分かりにくくなるだけなので今は改めてます),
この場合はあまりよくないのではないかと・・・。
もちろん $check = 4 のままで使うのならいいのですが,
これを見て他の人が「 9 人制限のチャットを作りたい」ってことで
$check = 9 に改造して使うとうまく動かなくなってしまいますよね?
( 10 > 9 ですが 10 lt 9 なので)

的外れなことを言ってたらすみません。

むぅす 2000/03/28(火) 22:37:47
>S-poreさん
ご指摘ありがとうございます。

>数値をわざわざ文字列比較しているのは何か意味があるのでしょうか?(高速化のためとか)
意味はありません(^^;;と言いますか何も考えずにやっていました。
(9人以上は、しないだろうと勝手に思っていました。)

>これを見て他の人が「 9 人制限のチャットを作りたい」ってことで
>$check = 9 に改造して使うとうまく動かなくなってしまいますよね?
>( 10 > 9 ですが 10 lt 9 なので)

そうですよね、文字列比較では
先頭から1文字ずつ比較しますから、文字コードが16進数で
10 gt 9 は 31 > 39 で偽になってしまいますね。
大変失礼いたしました。

>みかんさん
>if ($num gt "$check"){
if ($num > "$check"){
にしてください。
(9人以上にしないのであればそのままでも良いですが)

みかん 2000/03/28(火) 23:21:20
[[解決]]
皆さんどうもありがとうございました。

得にむぅすさん。
私の初心者ナイズしたお馬鹿な質問にも
丁寧にお答えくださり、本当に感謝しています。

お陰でキチンと動作するようになりました。

本当にありがとうございました m(_ _)m

[上に] [前に] [次に]