From Gustavo6046, 4 Months ago, written in UnrealScript.
Embed
  1. class IRCClient extends TcpLink;
  2.  
  3. config var string IrcServer;
  4. config var int IrcPort, CurrPort;
  5. config var string IrcChannel[40];
  6. config var string Nickname;
  7. config var bool bRandomSuffix; // useful for multiple servers
  8. config var class<IRCMutator> HudType;
  9.  
  10. travel var bool bAutoConnect;
  11. travel var IRCMutator IRCHUD;
  12.  
  13. var ChallengeHUD MatchHUD;
  14. var HUDLocalizedMessage LastMessages[4];
  15. var int NumLast;
  16.  
  17.  
  18. simulated function Tick(float TimeDelta)
  19. {
  20.         local int i, j, k;
  21.         local bool b;
  22.  
  23.         for ( j = 0; j < 4; j++ )
  24.         {
  25.                 b = false;
  26.                
  27.                 for ( i = 0; i < 4; i++ )
  28.                         if ( MatchHUD.ShortMessageQueue[i] == LastMessages[j] )
  29.                                 b = true;
  30.                                
  31.                 if ( !b )
  32.                         for ( k = j; k < 4; k++ )
  33.                                 LastMessages[k] = LastMessages[k + 1];
  34.         }
  35.                
  36.         for ( i = 0; i < 4; i++ )
  37.         {
  38.                 if ( MatchHUD.ShortMessageQueue[i] == None )
  39.                         return;
  40.                        
  41.                 for ( j = 0; j < 4; j++ )
  42.                         if ( MatchHUD.ShortMessageQueue[i] == LastMessages[j] )
  43.                                 return;
  44.                                
  45.                 LastMessages[NumLast] = MatchHUD.ShortMessageQueue[i];
  46.                
  47.                 for ( int i = 0; i < 40 && IrcChannel[i] != ""; i++ )
  48.                         SendMessage(MatchHUD.ShortMessageQueue[i].StringMessage, IrcChannel[i], MatchHUD.ShortMessageQueue[i].RelatedPRI);
  49.                
  50.                 NumLast++;
  51.         }
  52. }
  53.  
  54. function bool WildParse(string Other, string Match, bool bIncomplete, out StringList Groups) // currently parses only "*"
  55. {
  56.         local int i, j;
  57.         local bool bMatching;
  58.         local string sub;
  59.  
  60.         for ( i = 0; i < Len(Other); i++ )
  61.         {
  62.                 if ( Mid(Match, j, 1) == "" )
  63.                 {
  64.                         if ( bIncomplete )
  65.                                 return true;
  66.                                
  67.                         else
  68.                                 return false;
  69.                 }
  70.        
  71.                 if ( Mid(Other, i, 1) == Mid(Match, j, 1) && !bMatching )
  72.                         j++;
  73.                        
  74.                 else if ( Mid(Match, j, 1) == "*" )
  75.                         bMatching = true;
  76.                        
  77.                 if ( !bMatching )
  78.                         return false;
  79.                        
  80.                 else
  81.                 {
  82.                         if ( Mid(Other, i, 1) == Mid(Match, j + 1, 1) )
  83.                         {
  84.                                 if ( Groups == None )
  85.                                 {
  86.                                         Groups = Spawn(class'StringList');
  87.                                         Groups.MyString = sub;
  88.                                 }
  89.                                
  90.                                 else
  91.                                         Groups.AppendString(sub);
  92.                                
  93.                                 j++;
  94.                                 bMatching = false;
  95.                         }
  96.                        
  97.                         else
  98.                                 sub $= Mid(Other, i, 1);
  99.                 }
  100.         }
  101.        
  102.         return true;
  103. }
  104.  
  105. function Destroyed()
  106. {
  107.         Close();
  108. }
  109.  
  110. function PreBeginPlay()
  111. {
  112.         local StringList Res;
  113.  
  114.         Super.PreBeginPlay();
  115.        
  116.         foreach AllActors(class'ChallengeHUD', MatchHUD)
  117.                 break;
  118.                
  119.         if ( MatchHUD == None )
  120.         {
  121.                 Destroy();
  122.                
  123.                 return;
  124.         }
  125.        
  126.         IRCHUD = Spawn(HudType);
  127.         IRCHUD.RegisterHUDMutator(IRCHUD);
  128.        
  129.         Log(WildParse("Hello World!", "H*o W*ld*", Res));
  130.         Log(Res.JoinList(""));
  131.        
  132.         LinkMode=MODE_Line;
  133.         ReceiveMode=RMODE_Event;
  134.        
  135.         if ( bAutoConnect )
  136.                 ConnectTo(IrcServer, IrcPort);
  137. }
  138.  
  139. function ConnectTo(string ServHost, int ServPort)
  140. {
  141.         CurrPort = ServPort;
  142.  
  143.         Resolve(ServHost);
  144. }
  145.  
  146. event Resolved(IpAddr Addr)
  147. {
  148.         local bool b;
  149.        
  150.         Addr.Port = CurrPort;
  151.         b = Open(Addr);
  152.        
  153.         if ( !b )
  154.         {
  155.                 IRCHUD.ErrorMessage("Could not connect to server.");
  156.                
  157.                 return;
  158.         }
  159. }
  160.  
  161. event Opened()
  162. {
  163.         IRCHUD.GoodMessage("Connected.");
  164. }
  165.  
  166. event Closed()
  167. {
  168.         IRCHUD.WarningMessage("Connection closed.");
  169. }
  170.  
  171. event ResolveFailed()
  172. {
  173.         IRCHUD.ErrorMessage("Could not resolve server hostname.");
  174. }
  175.  
  176. event ReceivedLine(string Line)
  177. {
  178.         local StringList Groups;
  179.         local int i;
  180.        
  181.         for ( i = 0; i < 40; i++ )
  182.                 if ( WildParse(Line, "* PRIVMSG"@IrcChannel[i]@":*") )
  183.                         IRCHUD.Message()
  184. }
  185.  
  186. simulated function SendMessage(coerce string Message, string Channel, PlayerReplicationInfo PRI)
  187. {
  188.         local String Event;
  189.         local int nbytes, tries;
  190.        
  191.         Event = "PRIVMSG"@Channel@":<"$PRI.PlayerName$">"@Message;
  192.        
  193.         IRCHUD.ReMessage(Event);
  194.        
  195.         while ( nbytes < Len(Event) && tries < 64 )
  196.         {
  197.                 nbytes = SendText(Right(Message, Len(Message) - nbytes));
  198.                
  199.                 tries++;
  200.         }
  201.        
  202.         if ( tries == 64 )
  203.                 IRCHUD.WarningMessage("Could not send"@Len(Message) - nbytes@"bytes.")
  204. }
  205.  
  206. defaultproperties
  207. {
  208.         bAutoConnect=true
  209.         Role=ROLE_Authority
  210.         RemoteRole=ROLE_SimulatedProxy
  211.         Nickname="UTChat"
  212.         IrcServer="irc.quakenet.org"
  213.         IrcPort=6667
  214.         IrcChannel(0)="#ut99"
  215.         bRandomSuffix=false
  216.         HUDType=class'GusPackII.IRCMutator'
  217. }