www.pudn.com > pino3srv-src.zip > 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.