2003.07.02 (水) 16:55:30 <Heracules> FASS-NGに搭載したものをさらに改良し、211ベース用に作り直してみました。
2003.07.02 (水) 16:56:31 <Heracules> FASS-NGでは、GetTickCountを使用してthredで管理してましたが、211101では、Timer3のIntervalを利用するように変えました。
2003.07.02 (水) 16:59:11 <Heracules> 共有作業が完了するまで自動入室しないように調整してます。待ち時間を10秒(試行錯誤の結果10秒くらいが適切と判断)にしTimer3のIntervalで-1秒、共有命令を受信したら10秒にリセット、0秒以下になったら自動入室を実行します。
2003.07.02 (水) 17:00:47 <Heracules> なお、間隔が短いと、共有完了前に入室してしまいます。
2003.07.02 (水) 17:01:33 <Heracules> 負荷のかかる環境で利用する場合には(公開鯖での自動入室を行うとは思えませんがw)、10をもっと大きな数字に変更するとよいかと思います。
2003.07.06 (日) 20:53:54 <Heracules> カウントにshuusei211100で行った修正を利用しています。
2003.07.16 (水) 12:29:34 <Heracules> 870コマンド(フォルダ単位での共有)のチェックを忘れていました。
2003.07.16 (水) 12:30:02 <Heracules> 211104にて修正と改良を同時に行います。
2003.07.16 (水) 22:13:43 <Heracules> 現時点での仮修正ですが、handler.pas内10179行をif (gcmd.id=100) or (gcmd.id=870) or (gcmd.id=10300) thenに変更。
2003.07.16 (水) 22:14:34 <Heracules> 本仮修正により、10秒待つ必要がなくなります。(1秒以上ならokだと思う)
2003.07.18 (金) 07:46:07 <Heracules> ・・・GetTickCount使って241ベースみたいな方法でカウントした方がいいかもしれません。そのように修正かけます。
shuusei211101:自動入室の改良(source by Heracules)

diff --dos -urN 211100/handler.pas 211101/handler.pas
--- 211100/handler.pas	Fri May 30 23:52:41 2003
+++ 211101/handler.pas	Wed Jul 02 10:04:42 2003
@@ -1236,11 +1236,11 @@
        if loginim[i]<>'' then
          local.Exec(MSG_CLIENT_PRIVMSG,loginim_user+' '+loginim[i]);
  end;
- if force_enter then begin
-   if (AnsiPos('WinMX',local.software)<>0) and (AnsiPos('3',local.software)<>0) then gcmd.cmd:='#WinMX_v3.x'
-   else gcmd.cmd:=force_enter_channel;
-   Handler_JoinChannel;
- end;
+// if force_enter then begin
+//   if (AnsiPos('WinMX',local.software)<>0) and (AnsiPos('3',local.software)<>0) then gcmd.cmd:='#WinMX_v3.x'
+//   else gcmd.cmd:=force_enter_channel;
+//   Handler_JoinChannel;
+// end;
  local.Flush;
  if dengon_enabled then begin
    gcmd.id:=MSG_CLIENT_DENGON_READNEW2;
@@ -10176,6 +10176,8 @@
   if query=queryNormal then
   begin
     str1:=gcmd.cmd;
+    if (gcmd.id=100) or (gcmd.id=10300) then
+      local.last_channel_time:=10;
     if (gcmd.id=2) or (gcmd.id=6) then
     begin
       SplitString(str1,hlist);
diff --dos -urN 211100/mainform.pas 211101/mainform.pas
--- 211100/mainform.pas	Sat May 31 03:41:40 2003
+++ 211101/mainform.pas	Wed Jul 02 15:53:24 2003
@@ -604,6 +604,7 @@
     function  isColumnVisible(list: TListView; n: Integer): Boolean;
     procedure SetColumnVisible(list: TListView; n: Integer; w: Integer; auto: Boolean);
     function CreateAnnounceWindow(users: TStringList): TSlavaNapAnnounceWindow;
+    procedure CheckForceEnter;
   end;
 
 var
@@ -4166,6 +4167,40 @@
   btn_servers_refreshClick(nil);
  if running and cb_users_autoref.Checked and (sec_counter mod userreftime = 0) then
   btn_users_refreshClick(nil);
+ CheckForceEnter;
+end;
+
+
+procedure TSlavaNapWindow.CheckForceEnter;
+var
+ i: Integer;
+ loc: TLocalUser;
+begin
+  tmp_pos:=12267;
+  if not force_enter then exit;
+  tmp_pos:=12268;
+  for i:=0 to db_local.count-1 do
+  begin
+    loc:=db_local.Items[i];
+    tmp_pos:=12269;
+    if loc.logged then
+    begin
+      if loc.last_channel_time>0 then
+      begin
+        loc.last_channel_time:=loc.last_channel_time -1;
+      end
+      else if (loc.last_channel_time<=0) and Not loc.auto_channel then
+      begin
+        if Not ((Pos('WinMX',loc.software)<>0) and (Pos('3',loc.software)<>0)) then
+        begin
+          gcmd.cmd:=force_enter_channel;
+          Handler_JoinChannel;
+          loc.auto_channel:=True;
+        end;
+      end;
+    end;
+  end;
+  tmp_pos:=12270;
 end;
 
 procedure TSlavaNapWindow.btn_hotlist_addClick(Sender: TObject);
diff --dos -urN 211100/localusers.pas 211101/localusers.pas
--- 211100/localusers.pas	Fri Dec 13 01:52:26 2002
+++ 211101/localusers.pas	Mon Jun 30 22:11:12 2003
@@ -56,6 +56,8 @@
   dlrequestsp3m   : Integer;
   wantqueuep3m    : Integer;
   ratepointcache  : Integer;
+  last_channel_time: Integer;
+  auto_channel     : Boolean;
   constructor Create;
   destructor Destroy; override;
   function  logged: Boolean;
@@ -113,6 +115,8 @@
  wantqueuep3m:=0;
  ratepointcache:=0;
  softwareID:=softUnknown;
+ last_channel_time:=10;
+ auto_channel:=False;
 {$IFDEF USERS_DOUBLE_QUEUE}
  StrHash_Reset(out_list2);
 {$ENDIF}