fmain.pas

来自「FIR引擎最新源码+注册」· PAS 代码 · 共 1,561 行 · 第 1/4 页

PAS
1,561
字号
unit FMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, JSocket, StdCtrls, ExtCtrls, Share, DataEngine, EDcode, IniFiles, Grobal2,
  Menus, ComCtrls, Grids, RzPanel, RzSplit;

type
  TfrmLMain = class(TForm)
    ServerSocket: TServerSocket;
    DecodeTime: TTimer;
    MainMenu: TMainMenu;
    MENU_CONTROL: TMenuItem;
    MENU_CONTROL_EXIT: TMenuItem;
    V1: TMenuItem;
    MENU_OPTION: TMenuItem;
    StartTimer: TTimer;
    Timer: TTimer;
    Panel1: TPanel;
    GridGate: TStringGrid;
    MemoLog: TMemo;
    N1: TMenuItem;
    IP1: TMenuItem;
    N2: TMenuItem;
    procedure ServerSocketClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocketClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    procedure ServerSocketClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocketClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure DecodeTimeTimer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure StartTimerTimer(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure MemoLogChange(Sender: TObject);
    procedure IP1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
  private
    procedure GetSerialNumber;
    procedure StartService();
    procedure StopService();
    procedure ShowMainMessage();
    procedure SendKeepAlivePacket(Socket: TCustomWinSocket);
    procedure DecodeUserData(Config: pTConfig; UserInfo: pTM2UserInfo; GateInfo: pTLoginGateInfo);
    procedure ReceiveSendUser(Config: pTConfig; sSockIndex: string;
      GateInfo: pTLoginGateInfo; sData: string);
    procedure ReceiveOpenUser(Config: pTConfig; sSockIndex, sIPaddr: string;
      GateInfo: pTLoginGateInfo);
    procedure ReceiveCloseUser(Config: pTConfig; sSockIndex: string;
      GateInfo: pTLoginGateInfo);
    procedure DecodeGateData(Config: pTConfig; GateInfo: pTLoginGateInfo);
    procedure ProcessGate(Config: pTConfig);
    procedure ProcessUserMsg(Config: pTConfig; UserInfo: pTM2UserInfo; GateInfo: pTLoginGateInfo; sMsg: string);

    procedure SendGateMsg(Socket: TCustomWinSocket; sSockIndex, sMsg: string);
    procedure SendGateKickMsg(Socket: TCustomWinSocket; sSockIndex: string);
    procedure SendGateAddBlockList(Socket: TCustomWinSocket; sSockIndex: string);
    procedure SendGateAddTempBlockList(Socket: TCustomWinSocket; sSockIndex: string);
    function KickUser(Config: pTConfig; UserInfo: pTM2UserInfo; nKickType: Integer): Boolean;
    function GetOnLineUser(sAccount, sPassword, sIPaddr: string): pTM2UserInfo;
    procedure UserLogin(Config: pTConfig; UserInfo: pTM2UserInfo; sData: string);
    procedure AddUser(Config: pTConfig; UserInfo: pTM2UserInfo; sData: string);
    procedure DelUser(Config: pTConfig; UserInfo: pTM2UserInfo; sData: string);
    procedure ChgUser(Config: pTConfig; UserInfo: pTM2UserInfo; sData: string);
    procedure SearchUser(Config: pTConfig; UserInfo: pTM2UserInfo; sData: string);

    procedure SuperUserAddUser(Config: pTConfig; UserInfo: pTM2UserInfo; sData: string);
    procedure SuperUserDelUser(Config: pTConfig; UserInfo: pTM2UserInfo; sData: string);
    procedure SuperUserChgUser(Config: pTConfig; UserInfo: pTM2UserInfo; sData: string);
    procedure SuperUserSearchUser(Config: pTConfig; UserInfo: pTM2UserInfo; sData: string);

    procedure ClientGetLicense(Config: pTConfig; UserInfo: pTM2UserInfo; GateInfo: pTLoginGateInfo; sData: string);
    { Private declarations }
  public
    { Public declarations }
  end;
procedure MainOutMessage(sMsg: string);
var
  frmLMain: TfrmLMain;
  boStarted: Boolean;
  g_sServerAddr: string = '0.0.0.0';
  g_nServerPort: Integer = 110;

  g_dwServerStartTick: LongWord;
  g_boCanStart: Boolean;
  sHdd: string;
  g_nHDD: Integer = 0;
  g_CriticalSection: TRTLCriticalSection;
  g_MainShowMsgList: TStringList;
implementation

uses HUtil32, EDcodeUnit, Common, HumDB, MD5EncodeStr;

{$R *.dfm}

procedure MainOutMessage(sMsg: string);
begin
  EnterCriticalSection(g_CriticalSection);
  try
    g_MainShowMsgList.Add('[' + DateTimeToStr(Now) + '] ' + sMsg);
  finally
    LeaveCriticalSection(g_CriticalSection);
  end;
end;

procedure TfrmLMain.GetSerialNumber;
begin
  g_nHDD := GetUniCode(RivestStr(GetDiskSerialNumber + GetCPUSerialNumber));
end;

procedure TfrmLMain.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  I: Integer;
  GateInfo: pTLoginGateInfo;
  Config: pTConfig;
begin
  Config := @g_Config;
  EnterCriticalSection(Config.GateCriticalSection);
  try
    for I := 0 to Config.GateList.Count - 1 do begin
      GateInfo := Config.GateList.Items[I];
      if GateInfo.Socket = Socket then begin
        GateInfo.sReceiveMsg := GateInfo.sReceiveMsg + Socket.ReceiveText;
        Break;
      end;
    end;
  finally
    LeaveCriticalSection(Config.GateCriticalSection);
  end;
end;

procedure TfrmLMain.ServerSocketClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  ErrorCode := 0;
  Socket.Close;
end;

procedure TfrmLMain.ServerSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  I: Integer;
  II: Integer;
  GateInfo: pTLoginGateInfo;
  UserInfo: pTM2UserInfo;
  Config: pTConfig;
begin
  Config := @g_Config;
  EnterCriticalSection(Config.GateCriticalSection);
  try
    for I := 0 to Config.GateList.Count - 1 do begin
      GateInfo := Config.GateList.Items[I];
      if GateInfo.Socket = Socket then begin
        for II := 0 to GateInfo.UserList.Count - 1 do begin
          UserInfo := GateInfo.UserList.Items[II];
          if Config.boShowDetailMsg then
            MainOutMessage('Close: ' + UserInfo.sUserIPaddr);
          Dispose(UserInfo);
        end;
        GateInfo.UserList.Free;
        Dispose(GateInfo);
        Config.GateList.Delete(I);
        Break;
      end;
    end;
  finally
    LeaveCriticalSection(Config.GateCriticalSection);
  end;
end;

procedure TfrmLMain.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  GateInfo: pTLoginGateInfo;
  Config: pTConfig;
begin
  New(GateInfo);
  GateInfo.Socket := Socket;
  GateInfo.sIPaddr := Socket.RemoteAddress;
  GateInfo.nPort := Socket.RemotePort;
  GateInfo.sReceiveMsg := '';
  GateInfo.UserList := TList.Create;
  GateInfo.dwKeepAliveTick := GetTickCount();
  GateInfo.nSuccesCount := 0;
  GateInfo.nFailCount := 0;
  Config := @g_Config;
  EnterCriticalSection(Config.GateCriticalSection);
  try
    Config.GateList.Add(GateInfo);
  finally
    LeaveCriticalSection(Config.GateCriticalSection);
  end;
end;

procedure TfrmLMain.DecodeTimeTimer(Sender: TObject);
var
  Config: pTConfig;
begin
  Config := @g_Config;
  ProcessGate(Config);
  ShowMainMessage();
end;

procedure TfrmLMain.ShowMainMessage;
var
  I: Integer;
begin
  EnterCriticalSection(g_CriticalSection);
  try
    for I := 0 to g_MainShowMsgList.Count - 1 do begin
      MemoLog.Lines.Add(g_MainShowMsgList.Strings[I]);
    end;
    g_MainShowMsgList.Clear;
  finally
    LeaveCriticalSection(g_CriticalSection);
  end;
end;

procedure TfrmLMain.StartService;
  procedure CreateSuperUser;
  var
    UserDataInfo: TRecordDataInfo;
  begin
    FillChar(UserDataInfo, SizeOf(TRecordDataInfo), 0);
    UserDataInfo.IPHeader.boDeleted := False;
    UserDataInfo.IPHeader.nUserQQ := 718846558;
    UserDataInfo.IPHeader.sAccount := 'Admin';
    UserDataInfo.IPHeader.sUserIPaddr := '127.0.0.1';
    UserDataInfo.IPHeader.dLastDate := Now;
    UserDataInfo.sAccount := 'Admin';
    UserDataInfo.sPassword := 'Admin';
    UserDataInfo.sUserIPaddr := '127.0.0.1';
    UserDataInfo.sSerialNumber := '';
    UserDataInfo.boDeleted := False;
    UserDataInfo.dCreateDate := Now;
    UserDataInfo.nUserQQ := 718846558;
    UserDataInfo.btPermission := 10;
    UserDataInfo.nMainVersion := 20070412;
    UserDataInfo.btSoftType := 3;
    UserDataInfo.nOwnerUserQQ := 718846558;
    UserDataInfo.btBind := 2;
    UserDataInfo.btMode := 3;
    UserDataInfo.dStartDate := Now;
    UserDataInfo.dEndDate := Date + 99999 + Time;
    UserDataInfo.nLicCount := 99999;
    UserDataInfo.nLicDays := 99999;
    UserDataInfo.nUserCount := 99999;
    try
      if GMHumDataDB.Open then begin
        GMHumDataDB.Add(UserDataInfo);
      end;
    finally
      GMHumDataDB.Close;
    end;
  end;
var
  Config: TIniFile;
  Conf: pTConfig;
  boCreate: Boolean;
begin
  if boStarted then Exit;
  MainOutMessage('正在启动服务...');
  boCreate := False;
  if not DirectoryExists('.\Data') then begin
    CreateDir('.\Data');
    boCreate := True;
  end;
  InitializeCriticalSection(HumDB_CS);
  HumDataDB := TFileHumDB.Create('.\Data\Hum.db');
  GMHumDataDB := TFileGMHumDB.Create('.\Data\GM.db');

  if boCreate then CreateSuperUser;

  Config := TIniFile.Create('.\Config.ini');
  if Config <> nil then begin
    g_sServerAddr := Config.ReadString('Setup', 'ServerAddr', g_sServerAddr);
    g_nServerPort := Config.ReadInteger('Setup', 'ServerPort', g_nServerPort);
  end;
  Conf := @g_Config;
  InitializeCriticalSection(Conf.GateCriticalSection);
  Conf.GateList := TList.Create;
  Conf.boShowDetailMsg := True;
  ServerSocket.Address := g_sServerAddr;
  ServerSocket.Port := g_nServerPort;
  ServerSocket.Active := True;
  DecodeTime.Enabled := True;
  Timer.Enabled := True;
  g_dwServerStartTick := GetTickCount();
  boStarted := True;
  MainOutMessage('启动服务完成...');
end;

procedure TfrmLMain.StopService;
var
  I, II: Integer;
  GateInfo: pTLoginGateInfo;
  UserInfo: pTM2UserInfo;
  Config: pTConfig;
begin
  if boStarted then Exit;
  MainOutMessage('正在停止服务...');
  DecodeTime.Enabled := False;
  Timer.Enabled := False;
  ServerSocket.Active := False;
  Config := @g_Config;
  for I := 0 to Config.GateList.Count - 1 do begin
    GateInfo := Config.GateList.Items[I];
    for II := 0 to GateInfo.UserList.Count - 1 do begin
      UserInfo := GateInfo.UserList.Items[I];
      Dispose(UserInfo);
    end;
    GateInfo.UserList.Free;
    Dispose(GateInfo);
  end;
  Config.GateList.Free;

  DeleteCriticalSection(Config.GateCriticalSection);
  HumDataDB.Free;
  GMHumDataDB.Free;
  DeleteCriticalSection(HumDB_CS);
  MainOutMessage('停止服务完成...');
  boStarted := False;
end;

procedure TfrmLMain.FormCreate(Sender: TObject);
var
  sFileName: string;
resourcestring
  sGateIdx = '网关';
  sGateIPaddr = '网关地址';
  //sGateListMsg = '队列数据';
  sGateSendCount = '授权成功';
  sGateMsgCount = '授权失败';
  //sGateSendKB = '平均流量';
  sGateUserCount = '在线人数';
begin
  GridGate.RowCount := 10;
  GridGate.Cells[0, 0] := sGateIdx;
  GridGate.Cells[1, 0] := sGateIPaddr;
  //GridGate.Cells[2, 0] := sGateListMsg;
  GridGate.Cells[2, 0] := sGateSendCount;
  GridGate.Cells[3, 0] := sGateMsgCount;
  //GridGate.Cells[5, 0] := sGateSendKB;
  GridGate.Cells[4, 0] := sGateUserCount;
  MemoLog.Clear;
  GetSerialNumber;
  g_boCanStart := True;
  g_dwServerStartTick := GetTickCount;
  StartTimer.Enabled := True;
end;

procedure TfrmLMain.StartTimerTimer(Sender: TObject);
begin
  StartTimer.Enabled := False;
  if g_boCanStart then begin
    StartService();
    g_boCanStart := False;
  end else begin
    StopService();
    g_boCanStart := True;
    Close;
  end;
end;

procedure TfrmLMain.TimerTimer(Sender: TObject);
var
  I, II: Integer;
  GateInfo: pTLoginGateInfo;
  UserInfo: pTM2UserInfo;
  Config: pTConfig;
  nRow: Integer;
begin
  if boStarted then begin
    {StatusBar.Panels[0].Text := '网络: ' + g_sServerAddr + ':' + IntToStr(g_nServerPort);
    StatusBar.Panels[1].Text := '连接: ' + IntToStr(ServerSocket.Socket.ActiveConnections);
    StatusBar.Panels[2].Text := '成功: ' + IntToStr(g_nCheckSuccesCount);
    StatusBar.Panels[3].Text := '失败: ' + IntToStr(g_nCheckFailCount);
    StatusBar.Panels[4].Text := CurrToStr((GetTickCount - g_dwServerStartTick) / (60 * 60 * 1000)) + '小时';  }
    nRow := 1;
    Config := @g_Config;
    EnterCriticalSection(Config.GateCriticalSection);
    try
      for I := 0 to Config.GateList.Count - 1 do begin

⌨️ 快捷键说明

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