⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 room.pas

📁 flash视频源码 flash视频源码
💻 PAS
字号:
unit room;

interface

uses Classes, SysUtils, ActUser;

type TRoom = class(TObject)
      private
       { Private-Deklarationen }
      protected
       { Protected-Deklarationen }
      public
       { Public-Deklarationen }
       BannedIPs:TList;
       BgCol:string[6];
       Closed,Hidden,System:Boolean;
       Gagged:TList;
       MaxUsers:Word;
       Name,Topic:string;
       Owner:TActUser;
       ROPS:TList;
       Users:TStringList;

       constructor Create(n:string);
       destructor Destroy; override;
       procedure AddUser(user:TActUser;addalways:Boolean);
       procedure RemoveUser(user:TActUser);
       procedure RoomAction(action,status:Char;user:TActUser;msg:string);
       function RoomInfo:string;
       procedure UpdateRoomInfo;
     end;

implementation

uses misc;

{$I ..\..\defines.inc}

constructor TRoom.Create(n:string);
  begin
    inherited Create;

    if RoomList.IndexOf(n)>-1 then raise Exception.Create('The room already exists.');
    BannedIPs:=TList.Create;
    BgCol:='FFFFFF';
    Closed:=false;
    Gagged:=TList.Create;
    Hidden:=false;
    MaxUsers:=0;
    Name:=n;
    Owner:=nil;
    ROPS:=TList.Create;
    System:=false;
    Topic:='';
    Users:=TStringList.Create;

    RoomList.AddObject(Name,self);
  end;

destructor TRoom.Destroy;
var i:Integer;
  begin
    for i:=0 to ActUsers.Count-1 do TActUser(ActUsers.Objects[i]).SendLine(PM_ROOMLIST,SC_REMOVE,EC_NOERROR,Name);
    RoomList.Delete(RoomList.IndexOf(Name));

    Users.Free;
    ROPS.Free;
    Gagged.Free;
    BannedIPs.Free;
    inherited Destroy;
  end;

procedure TRoom.AddUser(user:TActUser;addalways:Boolean);
var i:Integer;UserSettings:string;du:TActUser;
  begin
    if Users.IndexOfObject(user)>-1 then Exit;

    if addalways=false then
      begin
        if BannedIPs.IndexOf(Pointer(user.IP.S_addr))>-1 then
          begin
            user.SendLine(PM_JOIN,SC_NORMAL,EC_BANNED,Name);
            Exit;
          end;

        if (MaxUsers>0)and(Users.Count>=MaxUsers) then
          begin
            user.SendLine(PM_JOIN,SC_NORMAL,EC_TOOMANYUSERS,Name);
            RoomAction(RA_KNOCK,SC_NORMAL,nil,user.Nick);
            Exit;
          end;

        if Closed then
          begin
            user.SendLine(PM_JOIN,SC_NORMAL,EC_LOCKED,Name);
            RoomAction(RA_KNOCK,SC_NORMAL,nil,user.Nick);
            Exit;
          end;
      end;

    Users.AddObject(user.Nick,user);                                                        // Adds the user to the userlist of the room
    if (Users.Count=1)and(System=false) then                                                // If the room is newly created and is not a system room the user is appointed as RoomOP
      begin
        Owner:=user;
        ROPS.Add(user);
      end;

    user.Rooms.AddObject(Name,self);                                                        // Adds the room to the roomlist of the user
    user.SendLine(PM_JOIN,SC_NORMAL,EC_NOERROR,Name+#1+BgCol);                              // Sends the user a confirmation

    UserSettings:=Name+#1+user.Nick+#1+user.Color+#1+user.UserStatus(self,true);
    for i:=0 to Users.Count-1 do
      begin
        du:=TActUser(Users.Objects[i]);

        if du<>user then user.SendLine(PM_ROOMACTION,RA_INITLIST,EC_NOERROR,SC_NORMAL+Name+#1+du.Nick+#1+du.Color+#1+du.UserStatus(self,true));
        du.SendLine(PM_ROOMACTION,RA_USERJOINED,EC_NOERROR,SC_NORMAL+UserSettings);
      end;
    UpdateRoomInfo;
  end;

procedure TRoom.RemoveUser(user:TActUser);
var i:Integer;
  begin
    i:=Users.IndexOf(user.Nick);
    if i=-1 then Exit;

    Users.Delete(i);
    ROPS.Remove(user);
    if Owner=user then Owner:=nil;
    user.Rooms.Delete(user.Rooms.IndexOf(Name));

    if (Users.Count>0)or(System=true) then
      begin
        RoomAction(RA_USERLEFT,SC_NORMAL,user,'');
        UpdateRoomInfo;
      end else Free;
  end;

procedure TRoom.RoomAction(action,status:Char;user:TActUser;msg:string);
var i:Integer;
  begin
    if user=nil then msg:=PM_ROOMACTION+action+EC_NOERROR+status+Name+#1+''+#1+''+#1+msg
      else msg:=PM_ROOMACTION+action+EC_NOERROR+status+Name+#1+user.Nick+#1+user.Color+#1+msg;
    for i:=0 to Users.Count-1 do TActUser(Users.Objects[i]).Send(msg);
  end;

function TRoom.RoomInfo:string;
  begin
    Result:=Name+#1+Topic+#1+BgCol+#1+IntToStr(Users.Count)+#1+IntToStr(MaxUsers)+#1+BS[System]+#1+BS[Closed]+#1+BS[Hidden];
  end;

procedure TRoom.UpdateRoomInfo;
var i:Integer;st:string;
  begin
    if Hidden then Exit;

    st:=RoomInfo;
    for i:=0 to ActUsers.Count-1 do TActUser(ActUsers.Objects[i]).SendLine(PM_ROOMLIST,SC_ADD,EC_NOERROR,st);
  end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -