prog

cubix

Sep 18th, 2010
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.70 KB | None | 0 0
  1. unit db;
  2.  
  3. {$I cubix.inc}
  4.  
  5. interface
  6.  
  7. uses
  8.   SysUtils;
  9.  
  10. const
  11.   AllowedFlags = ['a'..'z', 'A'..'Z'];
  12.  
  13. type
  14.   TFlagSet = set of Char;
  15.  
  16.   PUser = ^TUser;  
  17.   PChannel = ^TChannel;
  18.   PBan = ^TBan;
  19.   PChanAcc = ^TChanAcc;
  20.  
  21.   TUser = record
  22.     NickName: string;
  23.     UserName: string;
  24.     HostName: string;
  25.     RealName: string;
  26.     Hand: string;
  27.     CommandFlood: Integer;
  28.     IsWellKnown: Boolean;
  29.     Next: PUser;
  30.     Prev: PUser;
  31.     Acc: PChanAcc;
  32.   end;
  33.  
  34.   TChannel = record
  35.     Name: string;
  36.     Topic: string;
  37.     Key: string;
  38.     Mode: TFlagSet;
  39.     Limit: Integer;
  40.     Prev: PChannel;
  41.     Next: PChannel;
  42.     Acc: PChanAcc;
  43.     Ban: PBan;
  44.     GotNickList: Boolean;
  45.     GotBanList: Boolean;
  46.     GotMode: Boolean;
  47.   end;
  48.  
  49.   TBan = record
  50.     Mask: string;
  51.     Maker: string;
  52.     Date: Cardinal;
  53.     Prev: PBan;
  54.     Next: PBan;
  55.     Channel: PChannel;
  56.   end;
  57.  
  58.   TChanAcc = record
  59.     Flags: TFlagSet;
  60.     LineFlood: Integer;
  61.     CharFlood: Integer;
  62.     CtcpFlood: Integer;
  63.     User: PUser;
  64.     Channel: PChannel;
  65.     PrevChan: PChanAcc;
  66.     NextChan: PChanAcc;
  67.     PrevUser: PChanAcc;
  68.     NextUser: PChanAcc;
  69.   end;
  70.  
  71. function NewUser: PUser;
  72. function NewChannel: PChannel;
  73. function NewBan(AChannel: PChannel): PBan;
  74. function NewAcc(AUser: PUser; AChannel: PChannel): PChanAcc;  
  75.  
  76.  
  77. function GetUser(NickName: string): PUser;
  78. function GetChannel(Name: string): PChannel;
  79. function GetBan(Channel: PChannel; Mask: string): PBan;
  80. function GetAcc(User: PUser; Channel: PChannel): PChanAcc;
  81.  
  82. function GetChanCount(User: PUser): Integer;
  83. function GetUserCount(Channel: PChannel): Integer;
  84. function GetBanCount(Channel: PChannel): Integer;
  85. function GetUserFromIndex(Channel: PChannel; Index: Integer): PUser;
  86. function GetChannelFromIndex(User: PUser; Index: Integer): PChannel;
  87. function GetBanFromIndex(Channel: PChannel; Index: Integer): PBan;
  88.  
  89. procedure FreeUser(User: PUser);
  90. procedure FreeChannel(Channel: PChannel);
  91. procedure FreeBan(Ban: PBan);
  92. procedure FreeAcc(Acc: PChanAcc; Recursive: Boolean = True);
  93.  
  94. procedure ClearAll;
  95. procedure CheckHands;
  96.  
  97. function FlagToStr(Flag: TFlagSet): string;
  98. function StrToFlag(FlagStr: string): TFlagSet;
  99. procedure AddFlags(var Flags: TFlagSet; AFlags: TFlagSet); overload;
  100. procedure DelFlags(var Flags: TFlagSet; AFlags: TFlagSet); overload;
  101. procedure AddFlags(var Flags: TFlagSet; FlagStr: string); overload;
  102. procedure DelFlags(var Flags: TFlagSet; FlagStr: string); overload;
  103.  
  104. var
  105.   UserRoot: PUser = nil;
  106.   ChanRoot: PChannel = nil;
  107.  
  108. implementation
  109.  
  110. function FlagToStr(Flag: TFlagSet): string;
  111. var
  112.   C: Char;
  113. begin
  114.   Result := '+';
  115.   for C := 'a' to 'z' do
  116.     if C in Flag then
  117.       Result := Result + C;
  118.   for C := 'A' to 'Z' do
  119.     if C in Flag then
  120.       Result := Result + C;
  121. end;
  122.  
  123. function StrToFlag(FlagStr: string): TFlagSet;
  124. var
  125.   i: Integer;
  126. begin
  127.   Result := [];
  128.   for i := 1 to Length(FlagStr) do
  129.     if FlagStr[i] in AllowedFlags then
  130.       Include(Result, FlagStr[i]);
  131. end;
  132.  
  133. procedure AddFlags(var Flags: TFlagSet; AFlags: TFlagSet);
  134. begin
  135.   Flags := Flags + AFlags;
  136. end;
  137.  
  138. procedure DelFlags(var Flags: TFlagSet; AFlags: TFlagSet);
  139. begin
  140.   Flags := Flags - AFlags;
  141. end;
  142.  
  143. procedure AddFlags(var Flags: TFlagSet; FlagStr: string);
  144. begin
  145.   AddFlags(Flags, FlagStr);
  146. end;
  147.  
  148. procedure DelFlags(var Flags: TFlagSet; FlagStr: string);
  149. begin
  150.   DelFlags(Flags, FlagStr);
  151. end;
  152.  
  153. function UpperCase(S: string): string;
  154. var
  155.   i: Integer;
  156. begin
  157.   Result := S;
  158.   for i := 1 to Length(S) do
  159.     Result[i] := UpCase(Result[i]);
  160. end;
  161.  
  162. function GetChannel(Name: string): PChannel;
  163. begin
  164.   Name := UpperCase(Name);
  165.   Result := ChanRoot;
  166.   while Result <> nil do
  167.   begin
  168.     if UpperCase(Result^.Name) = Name then
  169.       Exit;
  170.     Result := Result^.Next;
  171.   end;
  172. end;
  173.  
  174. function GetBan(Channel: PChannel; Mask: string): PBan;
  175. begin
  176.   Mask := UpperCase(Mask);
  177.   Result := Channel^.Ban;
  178.   while Result <> nil do
  179.   begin
  180.     if UpperCase(Result^.Mask) = Mask then
  181.       Exit;
  182.     Result := Result^.Next;
  183.   end;
  184. end;
  185.  
  186. function GetUser(NickName: string): PUser;
  187. begin
  188.   NickName := UpperCase(NickName);
  189.   Result := UserRoot;
  190.   while Result <> nil do
  191.   begin
  192.     if UpperCase(Result^.NickName) = NickName then
  193.       Exit;
  194.     Result := Result^.Next;
  195.   end;
  196. end;
  197.  
  198. function GetAcc(User: PUser; Channel: PChannel): PChanAcc;
  199. begin
  200.   if (User = nil) or (Channel = nil) then
  201.   begin
  202.     Result := nil;
  203.     Exit;
  204.   end;
  205.   Result := User^.Acc;
  206.   while Result <> nil do
  207.   begin
  208.     if Result^.Channel = Channel then
  209.       Exit;
  210.     Result := Result^.NextChan;
  211.   end;
  212. end;
  213.  
  214. function GetChanCount(User: PUser): Integer;
  215. var
  216.   Ac: PChanAcc;
  217. begin
  218.   Result := 0;
  219.   if User = nil then
  220.     Exit;
  221.   Ac := User^.Acc;
  222.   while Ac <> nil do
  223.   begin
  224.     Inc(Result);
  225.     Ac := Ac^.NextChan;
  226.   end;
  227. end;
  228.  
  229. function GetUserCount(Channel: PChannel): Integer;
  230. var
  231.   Ac: PChanAcc;
  232. begin
  233.   Result := 0;
  234.   if Channel = nil then
  235.     Exit;
  236.   Ac := Channel^.Acc;
  237.   while Ac <> nil do
  238.   begin
  239.     Inc(Result);
  240.     Ac := Ac^.NextUser;
  241.   end;
  242. end;
  243.  
  244. function GetBanCount(Channel: PChannel): Integer;
  245. var
  246.   Bn: PBan;
  247. begin
  248.   Result := 0;
  249.   if Channel = nil then
  250.     Exit;
  251.   Bn := Channel^.Ban;
  252.   while Bn <> nil do
  253.   begin
  254.     Inc(Result);
  255.     Bn := Bn^.Next;
  256.   end;
  257. end;
  258.  
  259. function GetUserFromIndex(Channel: PChannel; Index: Integer): PUser;
  260. var
  261.   i: Integer;
  262.   Ac: PChanAcc;
  263. begin
  264.   if Channel = nil then
  265.   begin
  266.     Result := nil;
  267.     Exit;
  268.   end;
  269.   Ac := Channel^.Acc;
  270.   for i := 0 to Index - 1 do
  271.   begin
  272.     if Ac = nil then
  273.     begin
  274.       Result := nil;
  275.       Exit;
  276.     end;
  277.     Ac := Ac^.NextUser;
  278.   end;
  279.   if Ac <> nil then
  280.   begin
  281.     Result := Ac^.User;
  282.   end
  283.   else
  284.   begin
  285.     Result := nil;
  286.   end;
  287. end;
  288.  
  289. function GetBanFromIndex(Channel: PChannel; Index: Integer): PBan;
  290. var
  291.   i: Integer;
  292.   Bn: PBan;
  293. begin
  294.   if Channel = nil then
  295.   begin
  296.     Result := nil;
  297.     Exit;
  298.   end;
  299.   Bn := Channel^.Ban;
  300.   for i := 0 to Index - 1 do
  301.   begin
  302.     if Bn = nil then
  303.     begin
  304.       Result := nil;
  305.       Exit;
  306.     end;
  307.     Bn := Bn^.Next;
  308.   end;
  309.   if Bn <> nil then
  310.   begin
  311.     Result := Bn;
  312.   end
  313.   else
  314.   begin
  315.     Result := nil;
  316.   end;
  317. end;
  318.  
  319.  
  320. function GetChannelFromIndex(User: PUser; Index: Integer): PChannel;
  321. var
  322.   i: Integer;
  323.   Ac: PChanAcc;
  324. begin
  325.   if User = nil then
  326.   begin
  327.     Result := nil;
  328.     Exit;
  329.   end;
  330.   Ac := User^.Acc;
  331.   for i := 0 to Index - 1 do
  332.   begin
  333.     if Ac = nil then
  334.     begin
  335.       Result := nil;
  336.       Exit;
  337.     end;
  338.     Ac := Ac^.NextChan;
  339.   end;
  340.   if Ac <> nil then
  341.   begin
  342.     Result := Ac^.Channel;
  343.   end
  344.   else
  345.   begin
  346.     Result := nil;
  347.   end;
  348. end;
  349.  
  350. procedure ClearAll;
  351. begin
  352.   while UserRoot <> nil do
  353.   begin
  354.     FreeUser(UserRoot);
  355.   end;
  356.   while ChanRoot <> nil do
  357.   begin
  358.     FreeChannel(ChanRoot);
  359.   end;
  360. end;
  361.  
  362. procedure CheckHands;
  363. var
  364.   Us: PUser;
  365. begin
  366.   Us := UserRoot;
  367.   while Us <> nil do
  368.   begin
  369.     if Us^.Acc = nil then
  370.       Us^.Hand := '';
  371.     Us := Us^.Next;
  372.   end;
  373. end;
  374.  
  375. function NewUser: PUser;
  376. begin
  377.   New(Result);
  378.   with Result^ do
  379.   begin
  380.     IsWellKnown := False;
  381.     NickName := '';
  382.     UserName := '';
  383.     HostName := '';
  384.     Hand := '';
  385.     CommandFlood := 0;
  386.     Acc := nil;
  387.     Prev := nil;
  388.     Next := UserRoot;
  389.   end;
  390.   if UserRoot <> nil then
  391.     UserRoot^.Prev := Result;
  392.   UserRoot := Result;
  393. end;
  394.  
  395. procedure FreeUser(User: PUser);
  396. begin
  397.   with User^ do
  398.   begin
  399.     if Next <> nil then
  400.       Next^.Prev := Prev;
  401.     if Prev <> nil then
  402.       Prev^.Next := Next
  403.     else
  404.       UserRoot := Next;
  405.     while Acc <> nil do
  406.       FreeAcc(Acc, False);
  407.     NickName := '';
  408.     UserName := '';
  409.     HostName := '';
  410.     Hand := '';
  411.   end;
  412.   Dispose(User);
  413. end;
  414.  
  415. function NewChannel: PChannel;
  416. begin
  417.   New(Result);
  418.   with Result^ do
  419.   begin
  420.     Mode := [];
  421.     Name := '';
  422.     Topic := '';
  423.     Key := '';
  424.     Limit := 0;
  425.     Acc := nil;
  426.     Ban := nil;
  427.     Prev := nil;
  428.     GotNickList := False;
  429.     GotBanList := False;
  430.     GotMode := False;
  431.     Next := ChanRoot;
  432.   end;
  433.   if ChanRoot <> nil then
  434.     ChanRoot^.Prev := Result;
  435.   ChanRoot := Result;
  436. end;
  437.  
  438. procedure FreeChannel(Channel: PChannel);
  439. begin
  440.   with Channel^ do
  441.   begin
  442.     if Next <> nil then
  443.       Next^.Prev := Prev;
  444.     if Prev <> nil then
  445.       Prev^.Next := Next
  446.     else
  447.       ChanRoot := Next;
  448.     while Ban <> nil do
  449.       FreeBan(Ban);
  450.     while Acc <> nil do
  451.       FreeAcc(Acc);
  452.     Name := '';
  453.     Topic := '';
  454.     Key := '';
  455.   end;
  456.   Dispose(Channel);
  457. end;
  458.  
  459. function NewBan(AChannel: PChannel): PBan;
  460. begin
  461.   New(Result);
  462.   with Result^ do
  463.   begin
  464.     Mask := '';
  465.     Maker := '';
  466.     Date := 0;
  467.     Channel := AChannel;
  468.     Prev := nil;
  469.     Next := Channel.Ban;
  470.     if Channel^.Ban <> nil then
  471.       Channel^.Ban^.Prev := Result;
  472.     Channel^.Ban := Result;
  473.   end;
  474. end;
  475.  
  476. procedure FreeBan(Ban: PBan);
  477. begin
  478.   with Ban^ do
  479.   begin
  480.     if Next <> nil then
  481.       Next^.Prev := Prev;
  482.     if Prev <> nil then
  483.       Prev^.Next := Next
  484.     else
  485.       Channel^.Ban := Next;
  486.     Mask := '';
  487.     Maker := '';
  488.   end;
  489.   Dispose(Ban);
  490. end;
  491.  
  492. function NewAcc(AUser: PUser; AChannel: PChannel): PChanAcc;
  493. begin
  494.   New(Result);
  495.  
  496.   Result^.Flags := [];
  497.   Result^.LineFlood := 0;
  498.   Result^.CharFlood := 0;
  499.   Result^.CtcpFlood := 0;
  500.  
  501.   Result^.Channel := AChannel;
  502.   Result^.User := AUser;
  503.  
  504.   Result^.PrevChan := nil;
  505.   Result^.NextChan := Result^.User^.Acc;
  506.   if Result^.NextChan <> nil then
  507.     Result^.NextChan^.PrevChan := Result;
  508.   Result^.User^.Acc := Result;
  509.                                
  510.   Result^.PrevUser := nil;
  511.   Result^.NextUser := AChannel^.Acc;
  512.   while (Result^.NextUser <> nil) and (UpperCase(Result^.NextUser^.User^.NickName) < UpperCase(AUser^.NickName)) do
  513.   begin
  514.     Result^.PrevUser := Result^.NextUser;
  515.     Result^.NextUser := Result^.NextUser^.NextUser;
  516.   end;
  517.  
  518.   if Result^.PrevUser = nil then
  519.   begin
  520.     AChannel^.Acc := Result;
  521.   end
  522.   else
  523.   begin
  524.     Result^.PrevUser^.NextUser := Result;
  525.     if Result^.NextUser <> nil then
  526.     begin
  527.       Result^.NextUser^.PrevUser := Result;
  528.     end;
  529.   end;
  530. end;
  531.  
  532. procedure FreeAcc(Acc: PChanAcc; Recursive: Boolean);
  533. begin
  534.   with Acc^ do
  535.   begin
  536.     if NextChan <> nil then
  537.       NextChan^.PrevChan := PrevChan;
  538.     if PrevChan <> nil then
  539.       PrevChan^.NextChan := NextChan
  540.     else
  541.       User^.Acc := NextChan;
  542.  
  543.     if NextUser <> nil then
  544.       NextUser^.PrevUser := PrevUser;
  545.     if PrevUSer <> nil then
  546.       PrevUser^.NextUser := NextUser
  547.     else
  548.       Channel^.Acc := NextUser;
  549.    
  550.     if Recursive then
  551.     begin
  552.       if (User^.Acc = nil) then
  553.         FreeUser(User);
  554.     end;
  555.   end;
  556.   Dispose(Acc);
  557. end;
  558.  
  559. end.
Add Comment
Please, Sign In to add comment