program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, IdTCPServer, IdContext, IdBaseComponent, IdComponent, IniFiles, Classes, ScktComp;
type
TServer = class(TObject)
IdTCPServer1: TIdTCPServer;
procedure IdTCPServer1Execute(AThread: TIdContext);
procedure IdTCPServer1Connect(AThread: TIdContext);
private
{ Private declarations }
constructor Create;
public
{ Public declarations }
end;
TChatServer = class(TObject)
Chat: TServerSocket;
Port: Word;
constructor Create;
procedure OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure OnClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure OnClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
end;
Const
Serverver = '0.03';
type
TDynStringArray = Array of string;
var
sl : TStringList;
Zeile : string;
Clientver : string;
i : Integer;
function Explode(const Separator, S :String; Limit :Integer = 0): TDynStringArray;
var
SepLen: Integer;
F, P: PChar;
begin
SetLength(Result, 0);
if (S = '') or (Limit < 0) then
Exit;
if Separator = '' then
begin
SetLength(Result, 1);
Result[0] := S;
Exit;
end;
SepLen := Length(Separator);
P := PChar(S);
while P^ <> #0 do
begin
F := P;
P := AnsiStrPos(P, PChar(Separator));
if (P = nil) or ((Limit > 0) and (Length(Result) = Limit - 1)) then
P := StrEnd(F);
SetLength(Result, Length(Result) + 1);
SetString(Result[High(Result)], F, P - F);
F := P;
if P = Separator then
SetLength(Result, Length(Result) + 1);
while (P^ <> #0) and (P - F < SepLen) do
Inc(P);
end;
end;
// ---------------------------- Chatserver ---------------------------- \\
procedure TChatServer.OnClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
writeln(Socket.RemoteAddress+' hat sich im Chatserver eingeloggt.');
end;
procedure TChatServer.OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
MSG : String;
begin
MSG := Socket.RemoteAddress+' : '+Socket.ReceiveText;
writeln(MSG);
for i := 0 to Chat.Socket.ActiveConnections-1 do
Chat.Socket.Connections[i].SendText(MSG);
end;
procedure TChatServer.OnClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
writeln(Socket.RemoteAddress+' hat sich vom Chatserver ausgeloggt.');
end;
// ---------------------------- Loginserver ---------------------------- \\
procedure TServer.IdTCPServer1Execute(AThread: TIdContext);
var
Data : String;
StrArr : TDynStringArray;
ini : TIniFile;
f : TextFile;
Files : string;
y,m,d : Word;
Admin : Integer;
begin
with AThread.Connection do
begin
DecodeDate(Now,d,m,y);
Files := Format('log\%.2d-%.2d-%.2d.txt',[y,m,d]);
//AssignFile(f, Files);
//if FileExists(Files) then Append(f) else Rewrite(f);
Data := String(Socket.ReadLn);
Data := Trim(Data);
if Length(Data) > 0 then
begin
StrArr := Explode('|', Data);
if StrArr[0] = 'login' then
begin
AssignFile(f,'version.txt');
Reset(f);
If IoResult=0 then
begin
ReadLn(f, Clientver);
CloseFile(f);
end;
if StrArr[3] = Clientver then
begin
if FileExists('accounts\'+StrArr[1]+'.ini') then
begin
ini := TIniFile.Create('accounts\'+StrArr[1]+'.ini');
try
if StrArr[2] = ini.ReadString('Login','Passwort','') then
begin
Admin := ini.ReadInteger('Admin','Level',0);
if Admin = 0 then
begin
Socket.WriteLn('login');
WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' hat sich eingeloggt.');
//WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' hat sich eingeloggt.');
end;
if Admin = 1 then
begin
Socket.WriteLn('login|admin');
WriteLn('['+TimeToStr(Time)+']'+' Admin: '+StrArr[1]+' hat sich eingeloggt.');
//WriteLn(f, '['+TimeToStr(Time)+']'+' Admin: '+StrArr[1]+' hat sich eingeloggt.');
end;
end
else
begin
Socket.WriteLn('invalid');
WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' falsches Passwort.');
//WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' falsches Passwort.');
end;
finally
ini.free;
end;
end
else
begin
Socket.WriteLn('na');
WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' existiert nicht.');
//WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' existiert nicht.');
end;
end
else
begin
Socket.WriteLn('version');
end;
end;
if StrArr[0] = 'register' then
begin
if FileExists('accounts\'+StrArr[1]+'.ini') then
begin
Socket.WriteLn('vorhanden');
WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' existiert bereits.');
//WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' existiert bereits.');
end
else
begin
try
ini := TIniFile.Create('accounts\'+StrArr[1]+'.ini');
ini.WriteString('Login','Passwort',StrArr[2]);
ini.WriteString('Login','E-Mail',StrArr[3]);
ini.WriteString('Data','Geschlecht',StrArr[4]);
ini.WriteString('Data','Geburtstag',StrArr[5]);
ini.WriteString('Data','ICQ',StrArr[6]);
ini.WriteString('Data','Name',StrArr[7]);
ini.WriteInteger('Stats','gespielt',0);
ini.WriteInteger('Stats','gewonnen',0);
ini.WriteInteger('Stats','verloren',0);
ini.WriteString('Stats','Spielzeit','00:00:00');
ini.WriteInteger('Admin','Level',0);
ini.WriteInteger('Admin','PermBan',0);
ini.WriteString('Admin','TempBan','1.1.2009');
ini.WriteString('Admin','Grund','');
ini.WriteString('Info','MAC','');
finally
Socket.WriteLn('erfolg');
ini.free;
WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' wurde registriert.');
//WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' wurde registriert.');
end;
end;
end;
if StrArr[0] = 'changepw' then
begin
if FileExists('accounts\'+StrArr[1]+'.ini') then
begin
ini := TIniFile.Create('accounts\'+StrArr[1]+'.ini');
if StrArr[2] = ini.ReadString('Login','Passwort','') then
begin
ini.WriteString('Login','Passwort',StrArr[3]);
Socket.WriteLn('pwchange');
WriteLn('['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' hat sein Passwort geaendert.');
//WriteLn(f, '['+TimeToStr(Time)+']'+' Account: '+StrArr[1]+' hat sein Passwort geaendert.');
end
else Socket.WriteLn('pwfalsch');
end;
end;
if StrArr[0] = 'AdminInfo' then
begin
if FileExists('accounts\'+StrArr[1]+'.ini') then
begin
ini := TIniFile.Create('accounts\'+StrArr[1]+'.ini');
try
Admin := ini.ReadInteger('Admin','Level',0);
if (StrArr[2] = ini.ReadString('Login','Passwort','')) and (Admin = 1) then
begin
if FileExists('accounts\'+StrArr[3]+'.ini') then
begin
ini.Free;
ini := TIniFile.Create('accounts\'+StrArr[3]+'.ini');
Socket.WriteLn('AdminInfo'+'|'+ini.ReadString('Login','E-Mail','')+'|'+ini.ReadString('Data','Geschlecht','')+'|'+ini.ReadString('Data','Geburtstag','')+'|'+ini.ReadString('Data','ICQ','')+'|'+ini.ReadString('Data','Name','')+'|'+InttoStr(ini.ReadInteger('Stats','gespielt',0))+'|'+InttoStr(ini.ReadInteger('Stats','gewonnen',0))+'|'+InttoStr(ini.ReadInteger('Stats','verloren',0))+'|'+ini.ReadString('Stats','Spielzeit','')+'|'+InttoStr(ini.ReadInteger('Admin','Level',0))+'|'+InttoStr(ini.ReadInteger('Admin','PermBan',0))+'|'+ini.ReadString('Admin','TempBan','')+'|'+ini.ReadString('Admin','Grund',''));
WriteLn('['+TimeToStr(Time)+']'+' Admin: '+StrArr[1]+' hat Informationen über '+StrArr[3]+' angefordert.');
//WriteLn(f, '['+TimeToStr(Time)+']'+' Admin: '+StrArr[1]+' hat Informationen über '+StrArr[3]+' angefordert.');
end;
end
else Socket.WriteLn('AdminInfoNA');
finally
ini.free;
end;
end;
end;
end;
end;
//CloseFile(f);
end;
procedure TServer.IdTCPServer1Connect(AThread: TIdContext);
begin
//
end;
constructor TServer.Create;
begin
inherited Create;
WriteLn('#######################');
WriteLn('## ##');
WriteLn('## Masterserver '+Serverver+' ##');
WriteLn('## ##');
WriteLn('#######################');
WriteLn('');
IdTCPServer1 := TIdTCPServer.Create(nil);
WriteLn('Server wurde initialisiert.');
IdTCPServer1.DefaultPort := 5000;
WriteLn('Server lauscht auf Port: '+InttoStr(IdTCPServer1.DefaultPort));
WriteLn('');
IdTCPServer1.TerminateWaitTime := 5000;
IdTCPServer1.OnConnect := IdTCPServer1Connect;
IdTCPServer1.OnExecute := IdTCPServer1Execute;
end;
constructor TChatServer.Create;
begin
inherited Create;
Chat := TServerSocket.Create(nil);
WriteLn('Chatserver wurde initialisiert.');
Chat.Port := 5002;
WriteLn('Chatserver lauscht auf Port: '+InttoStr(Chat.Port));
Chat.OnClientConnect := OnClientConnect;
Chat.OnClientDisconnect := OnClientDisconnect;
Chat.OnClientRead := OnClientRead;
end;
var
Server : TServer;
ChatServer : TChatServer;
begin
Server := TServer.Create;
Server.IdTCPServer1.Active := True;
ChatServer := TChatServer.Create;
ChatServer.Chat.Active := True;
While True do Sleep(50);
end.