Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.82 KB | None | 0 0
  1. procedure TELIRCClient.ParseServerResponse(const aText: string);
  2. var
  3.   R:      TResponse;
  4.   a, b:   integer;
  5.   l:      integer;
  6.   NumCmd: integer;
  7. begin
  8.   if (Connected = False) then
  9.     Exit;
  10.  
  11.   R.Count := 0;
  12.   R.Str   := aText;
  13.   a       := 1;
  14.   b       := 1;
  15.   l       := Length(aText);
  16.   while (a <= l) do
  17.   begin
  18.     if (aText[a] = CSpace) then
  19.     begin
  20.       if (b < a) then
  21.       begin
  22.         // Command separated by space
  23.         if (R.Cmd = CEmpty) then
  24.         begin
  25.           R.Cmd := Copy(aText, b, a - b);
  26.           Inc(a);
  27.           b := a;
  28.         end
  29.         else
  30.         begin
  31.           R.Add(Copy(aText, b, a - b));
  32.           Inc(a);
  33.           b := a;
  34.         end;
  35.       end
  36.       else
  37.       begin
  38.         // Consequitive space, trim it.
  39.         Inc(a);
  40.         b := a;
  41.       end;
  42.     end
  43.     else
  44.     if (aText[a] = CColon) then
  45.     begin
  46.       if (a = 1) and (R.Prefix = CEmpty) then
  47.       begin
  48.         // Message prefix
  49.         Inc(a);
  50.         b := a;
  51.         while (a <= l) do
  52.         begin
  53.           if (aText[a] = CSpace) then
  54.           begin
  55.             R.Prefix := Copy(aText, b, a - b);
  56.             Inc(a);
  57.             b := a;
  58.             Break;
  59.           end
  60.           else
  61.             Inc(a);
  62.         end;
  63.       end
  64.       else
  65.       begin
  66.         // Last parameter
  67.         if (b = a) then
  68.         begin
  69.           Inc(a);
  70.           b := a;
  71.           R.Add(Copy(aText, b, MaxInt));
  72.           a := l + 1;
  73.           b := l + 1;
  74.           Break;
  75.         end
  76.         else
  77.         begin
  78.           R.Add(Copy(aText, b, MaxInt));
  79.           Inc(a);
  80.           b := a;
  81.         end;
  82.       end;
  83.     end
  84.     else
  85.       Inc(a);
  86.   end;
  87.  
  88.   if (b < a) then
  89.     R.Add(Copy(aText, b, a));
  90.  
  91.   // Handle server messages
  92.  
  93.   if (SameText(R.Cmd, CPING)) then { PING }
  94.   begin
  95.     if (R.Count > 0) then
  96.       Self.Raw(CPONG + CSpace + CColon + R.Get(0))
  97.     else
  98.       Self.Raw(CPONG);
  99.   end
  100.   else
  101.   if (SameText(R.Cmd, CPRIVMSG)) then { PRIVMSG }
  102.   begin
  103.     DoOnPrivMsg(R.Nick, R.Prefix, R.Get(0), R.Get(1));
  104.   end
  105.   else
  106.   if (SameText(R.Cmd, CNOTICE)) then { NOTICE }
  107.   begin
  108.     DoOnNotice(R.Get(0), R.Get(1));
  109.   end
  110.   else
  111.   if (SameText(R.Cmd, CJOIN)) then { JOIN }
  112.   begin
  113.     DoOnPrivMsg(R.Nick, R.Prefix, R.Get(0), R.Get(1));
  114.   end
  115.   else
  116.   if (SameText(R.Cmd, CPART)) then { PART }
  117.   begin
  118.     DoOnPrivMsg(R.Nick, R.Prefix, R.Get(0), R.Get(1));
  119.   end
  120.   else
  121.   if (SameText(R.Cmd, CKICK)) then { KICK }
  122.   begin
  123.     DoOnPrivMsg(R.Nick, R.Prefix, R.Get(0), R.Get(1));
  124.   end
  125.   else
  126.   if (SameText(R.Cmd, CMODE)) then { MODE }
  127.   begin
  128.     DoOnPrivMsg(R.Nick, R.Prefix, R.Get(0), R.Get(1));
  129.   end
  130.   else
  131.   if (SameText(R.Cmd, CNICK)) then { NICK }
  132.   begin
  133.     DoOnPrivMsg(R.Nick, R.Prefix, R.Get(0), R.Get(1));
  134.   end
  135.   else
  136.   if (SameText(R.Cmd, CQUIT)) then { QUIT }
  137.   begin
  138.     DoOnPrivMsg(R.Nick, R.Prefix, R.Get(0), R.Get(1));
  139.   end
  140.   else
  141.   if (SameText(R.Cmd, CINVITE)) then { INVITE }
  142.   begin
  143.     DoOnPrivMsg(R.Nick, R.Prefix, R.Get(0), R.Get(1));
  144.   end
  145.   else
  146.   if (SameText(R.Cmd, CKILL)) then { KILL }
  147.   begin
  148.     DoOnPrivMsg(R.Nick, R.Prefix, R.Get(0), R.Get(1));
  149.   end
  150.   else
  151.   if (SameText(R.Cmd, CWALLOPS)) then { WALLOPS }
  152.   begin
  153.     DoOnPrivMsg(R.Nick, R.Prefix, R.Get(0), R.Get(1));
  154.   end
  155.   else
  156.   if (SameText(R.Cmd, CTOPIC)) then { TOPIC }
  157.   begin
  158.     DoOnPrivMsg(R.Nick, R.Prefix, R.Get(0), R.Get(1));
  159.   end
  160.   else
  161.   begin
  162.     NumCmd := StrToIntDef(R.Cmd, 0);
  163.     case NumCmd of
  164.  
  165.       001: ; { RPL_WELCOME }
  166.       002: ; { RPL_YOURHOST }
  167.       003: ; { RPL_CREATED }
  168.       004: ; { RPL_MYINFO }
  169.       219: ; { ENDOFSTATS }
  170.       235: ; { SERVLISTEND }
  171.       301: ; { AWAY }
  172.       302: ; { USERHOST }
  173.       303: ; { ISON }
  174.       305: ; { UNAWAY }
  175.       306: ; { NOWAWAY }
  176.       311: ; { WHOISUSER }
  177.       312: ; { WHOISSERVER }
  178.       313: ; { WHOISOPERATOR }
  179.       314: ; { WHOWASUSER }
  180.       315: ; { ENDOFWHO }
  181.       318: ; { ENDOFWHOIS }
  182.       322: ; { LIST }
  183.       323: ; { LISTEND }
  184.       324: ; { CHANMODEIS }
  185.       331: ; { NOTOPIC }
  186.       341: ; { INVITING }
  187.       342: ; { SUMMONING }
  188.       347: ; { ENDOFINVITELIST }
  189.       349: ; { ENDOFEXCEPTLIST }
  190.       351: ; { SVERSION }
  191.       365: ; { ENDOFLINKS }
  192.       366: ; { ENDOFNAMES }
  193.       368: ; { ENDOFBANLIST }
  194.       369: ; { ENDOFWHOWAS }
  195.       374: ; { ENDOFINFO }
  196.       376: ; { ENDOFMOTD }
  197.       381: ; { YOUREOPER }
  198.       382: ; { REHASHING }
  199.       383: ; { YOUARESERVICE }
  200.       391: ; { STIME }
  201.       394: ; { ENDOFUSERS }
  202.  
  203.       006, 007: { MAP }
  204.       begin
  205.         { Not Implemented }
  206.       end;
  207.  
  208.       005, 400..424, 437..502: { Server errors }
  209.       begin
  210.  
  211.       end;
  212.  
  213.       431..433, 436: { Nickname error }
  214.       begin
  215.  
  216.       end;
  217.  
  218.       else
  219.         DoOnUnhandledReply(R.Str);
  220.  
  221.     end; { case }
  222.   end;
  223. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement