📄 misc.pas
字号:
unit misc;
interface
uses server,WinSock,Classes,IniFiles,Windows;
type TRegUser=packed record
nick:string[20];
pwd:Integer;
email,hp:string[80];
note:string[255];
color:Integer;
cloak:Boolean;
reged,lastlogin:TDateTime;
active,chatop:Boolean;
end;
PRegUser=^TRegUser;
TPINOmail=packed record
sender:string[20];
subject:string[80];
date:TDateTime;
msg:string[255];
end;
const sosa:Integer=SizeOf(TSockAddr);
const soru=SizeOf(TRegUser);
const Build:Word=263;
const IniSections:array[1..5] of string=('General','System rooms','Users','Administration','Banners');
const BS:array[false..true] of Char=('0','1');
var
chatname:string;
welcome:TStringList;
port:Word;
adm_pwd,adm_port:Integer;
bindto,adm_bindto:string;
maxrooms:Integer;
cui:string;
sysrooms:TStringList;
noanos:Boolean;
regpass,maxusers,timeout:Integer;
UserIPs,AdminIPs:TStringList;
bannerupdate:Integer;
banners:TStringList;
synchronizer:TRTLCriticalSection;
chatserver,adm_server:TServer;
pinoroot,logfile:string;
inifile:TIniFile;
userdb:Integer;
db_na:Boolean;
logger:TextFile;
RegUsers,ActUsers:TStringList;
RoomList,OPKicked:TStringList;
function AllowedIP(ip:string;iplist:TStringList;default:Boolean):Boolean;
procedure CloseSock(Socket:TSocket);
procedure Log(st:string);
procedure MakeSystemRooms;
function SystemRoomCount:Integer;
implementation
uses SysUtils, tools, room;
{$I ..\..\defines.inc}
function AllowedIP(ip:string;iplist:TStringList;default:Boolean):Boolean;
var i,i2:Integer;st:string;match:Boolean;rule:Char;PatternTokens,IPtokens:TStringList;
begin
Result:=default;
PatternTokens:=TStringList.Create;
IPtokens:=TStringList.Create;
for i:=0 to iplist.Count-1 do
begin
st:=iplist[i];
if Length(st)=0 then Continue;
rule:=st[1];
Delete(st,1,1);
DivUp(st,'.',PatternTokens,4,4);
DivUp(ip,'.',IPtokens,4,4);
match:=true;
for i2:=0 to 3 do if PatternTokens[i2]<>'*' then match:=(match)and(PatternTokens[i2]=IPtokens[i2]);
if match then
begin
case UpCase(rule) of
'A' :Result:=true;
'D' :Result:=false;
end;
Break;
end;
end;
IPtokens.Free;
PatternTokens.Free;
end;
procedure CloseSock(Socket:TSocket);
var linger:TLinger;
begin
WinSock.shutdown(Socket,2);
linger.l_onoff:=1;
linger.l_linger:=0;
setsockopt(Socket,SOL_SOCKET,SO_LINGER,@linger,SizeOf(TLinger));
closesocket(Socket);
end;
procedure Log(st:string);
begin
try
if FileExists(logfile) then Append(logger) else Rewrite(logger);
Writeln(logger,'['+FormatDateTime('yyyy.mm.dd hh:nn:ss',Now)+'] '+st);
CloseFile(logger);
except
Writeln('Could not write the Log file.');
end;
end;
procedure MakeSystemRooms;
var i,i2:Integer;newroom:TRoom;values:string;
begin
for i:=RoomList.Count-1 downto 0 do TRoom(RoomList[i]).Free;
for i:=0 to sysrooms.Count-1 do
begin
newroom:=TRoom.Create(sysrooms.Names[i]);
values:=sysrooms.Values[newroom.Name];
i2:=Pos(',',values);
if i2=0 then i2:=Length(values)+1;
if i2=7 then
begin
newroom.BgCol:=Copy(values,1,6);
try
StrToInt('$'+newroom.BgCol);
except
newroom.BgCol:='FFFFFF';
end;
end else newroom.BgCol:='FFFFFF';
Delete(values,1,i2);
newroom.System:=true;
newroom.Topic:=values;
end;
end;
function SystemRoomCount:Integer;
var i:Integer;
begin
Result:=0;
for i:=0 to RoomList.Count-1 do if TRoom(RoomList.Objects[i]).System then Inc(Result) else Exit;
end;
begin
pinoroot:=ExtractFilePath(ParamStr(0));
logfile:=pinoroot+'PINO 3-Server Logfile - '+FormatDateTime('yyyy-mm-dd hh.nn.ss',Now)+'.txt';
AssignFile(logger,logfile);
inifile:=TIniFile.Create(pinoroot+'PINO3SRV.INI');
welcome:=TStringList.Create;
sysrooms:=TStringList.Create;
UserIPs:=TStringList.Create;
AdminIPs:=TStringList.Create;
banners:=TStringList.Create;
RegUsers:=TStringList.Create;
ActUsers:=TStringList.Create;
RoomList:=TStringList.Create;
OPKicked:=TStringList.Create;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -