public void InjectChannelMessage(string channel, string nick, string message) { var messageArgs = new TestChannelMessageEventArgs { Channel = channel, SenderNickname = nick, Message = message }; ChannelMessage.Invoke(this, messageArgs, MessageFlags.None); }
private void ProcessData(string data, Badge badge) { string[] ircData = data.Split(' '); var indx = 1; if (badge.DisplayName == string.Empty || badge.DisplayName == null) { indx = 1; } else { indx = 2; } var ircCommand = ircData[indx]; if (data.Length > 4) { if (data.Substring(0, 4) == "PING") { // hardcoded to twitch server Send("PONG :tmi.twitch.tv"); return; } } // re-act according to the IRC Commands switch (ircCommand) { case "001": // server welcome message, after this we can join Send("MODE " + nick + " +B"); log.Add($"Connected to {serverName}"); OnConnect?.Invoke(this, new EventArgs()); break; case "353": // member list { var channel = ircData[5]; if (ircData.Length > 5) { string[] userList = JoinArray(ircData, 5).Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); } } break; case "433": var takenNick = ircData[4]; break; case "JOIN": // someone joined { var channel = ircData[2]; var user = ircData[0].Substring(1, ircData[1].IndexOf("!", StringComparison.Ordinal) - 1); } break; case "MODE": // MODE was set { var channel = ircData[3]; if (channel != Username) { string from; if (ircData[0].Contains("!")) { from = ircData[1].Substring(1, ircData[1].IndexOf("!", StringComparison.Ordinal) - 1); } else { from = ircData[1].Substring(1); } var to = ircData[5]; var mode = ircData[4]; } // TODO: event for userMode's } break; case "NICK": // someone changed their nick var oldNick = ircData[1].Substring(1, ircData[1].IndexOf("!", StringComparison.Ordinal) - 1); var newNick = JoinArray(ircData, 4); //Fire_NickChanged(new UserNickChangedEventArgs(oldNick, newNick)); break; case "NOTICE": // someone sent a notice { var from = ircData[1]; var message = JoinArray(ircData, 4); if (from.Contains("!")) { from = from.Substring(1, ircData[1].IndexOf('!') - 1); NoticeMessage?.Invoke(this, new NoticeMessageEventArgs(from, message)); } else { NoticeMessage?.Invoke(this, new NoticeMessageEventArgs(serverName, message)); } log.Add($"We get NOTICE: {message}"); } break; case "PRIVMSG": // message was sent to the channel or as private { var from = ircData[1].Substring(1, ircData[1].IndexOf('!') - 1); var to = ircData[3]; var message = JoinArray(ircData, 4); // if it's a private message if (string.Equals(to, nick, StringComparison.CurrentCultureIgnoreCase)) { PrivateMessage?.Invoke(this, new PrivateMessageEventArgs(from, message)); } else { ChannelMessage?.Invoke(this, new ChannelMessageEventArgs(to, from, message, badge)); } } break; case "WHISPER": { var from = ircData[1].Substring(1, ircData[1].IndexOf('!') - 1); var to = ircData[3]; var message = JoinArray(ircData, 4); WhisperMessage?.Invoke(this, new PrivateMessageEventArgs(from, message)); } break; case "PART": case "QUIT": // someone left { var channel = ircData[3]; var user = ircData[1].Substring(1, data.IndexOf("!") - 1); //Fire_UserLeft(new UserLeftEventArgs(channel, user)); Send("NAMES " + ircData[3]); log.Add("We QUIT"); } break; default: // still using this while debugging if (ircData.Length > 4) { ServerMessage?.Invoke(this, JoinArray(ircData, 3)); } break; } }
protected override void HandleAppPacket(AppPacket packet) { try { // UnityEngine.Debug.Log($"Got packet { (ZoneOp)packet.Opcode} (0x{ packet.Opcode:X04}"); switch ((ZoneOp)packet.Opcode) { case ZoneOp.PlayerProfile: var player = packet.Get <PlayerProfile>(); UnityEngine.Debug.Log("Profile:" + player); break; case ZoneOp.CharInventory: // var inventory = packet.Get<CharInventory>(); // UnityEngine.Debug.Log("Inventory: "+inventory); break; case ZoneOp.TimeOfDay: // var timeofday = packet.Get<TimeOfDay>(); // UnityEngine.Debug.Log(timeofday); break; case ZoneOp.TaskActivity: // var activity = packet.Get<TaskActivity>(); // UnityEngine.Debug.Log(activity); break; case ZoneOp.TaskDescription: // var desc = packet.Get<TaskDescription>(); // UnityEngine.Debug.Log(desc); break; case ZoneOp.CompletedTasks: // var comp = packet.Get<CompletedTasks>(); // UnityEngine.Debug.Log(comp); break; case ZoneOp.XTargetResponse: // var xt = packet.Get<XTarget>(); // UnityEngine.Debug.Log(xt); break; case ZoneOp.Weather: // var weather = packet.Get<Weather>(); // UnityEngine.Debug.Log(weather); if (entering) { Send(AppPacket.Create(ZoneOp.ReqNewZone)); } break; case ZoneOp.TributeTimer: //var timer = packet.Get<TributeTimer>(); // UnityEngine.Debug.Log(timer); break; case ZoneOp.TributeUpdate: // var update = packet.Get<TributeInfo>(); // UnityEngine.Debug.Log(update); break; case ZoneOp.ZoneEntry: var mob = packet.Get <Spawn>(); ZoneEntry.Invoke(this, mob); //UnityEngine.Debug.Log(mob); break; case ZoneOp.NewZone: Send(AppPacket.Create(ZoneOp.ReqClientSpawn)); break; case ZoneOp.SendExpZonein: if (packet.Data.Length == 0) { Send(AppPacket.Create(ZoneOp.ClientReady)); entering = false; } break; case ZoneOp.SendFindableNPCs: // var npc = packet.Get<FindableNPC>(); // UnityEngine.Debug.Log(npc); break; case ZoneOp.ClientUpdate: UnityEngine.Debug.Log("Sending Client Update"); //PlayerPositionUpdateServer.Invoke(this, packet.Get<PlayerPositionUpdateServer>()); break; case ZoneOp.SpawnAppearance: break; case ZoneOp.Stamina: break; case ZoneOp.SpecialMesg: break; case ZoneOp.Death: break; case ZoneOp.DeleteSpawn: DeleteSpawn.Invoke(this, packet.Get <DeleteSpawn>()); break; case ZoneOp.PlayerStateAdd: break; case ZoneOp.PlayerStateRemove: break; case ZoneOp.ChannelMessage: UnityEngine.Debug.Log("Got channel message"); ChannelMessage.Invoke(this, packet.Get <ChannelMessage>()); break; case ZoneOp.HPUpdate: SpawnHPUpdate.Invoke(this, packet.Get <SpawnHPUpdate>()); break; case ZoneOp.ManaUpdate: break; case ZoneOp.EnduranceUpdate: break; case ZoneOp.SpawnPositionUpdate: SpawnPositionUpdate.Invoke(this, packet.Get <SpawnPositionUpdate>()); break; case ZoneOp.BuffCreate: break; case ZoneOp.AltCurrency: break; case ZoneOp.WearChange: break; case ZoneOp.GuildMOTD: break; case ZoneOp.RaidUpdate: break; case ZoneOp.ExpUpdate: break; case ZoneOp.WorldObjectsSent: break; case 0x0: //This is a catch for an empty OP that happens.. dunno break; case ZoneOp.SendAAStats: break; case ZoneOp.SendZonepoints: break; case ZoneOp.GroundSpawn: break; case ZoneOp.SpawnDoor: break; default: UnityEngine.Debug.Log($"Unhandled packet in ZoneStream: {(ZoneOp) packet.Opcode} (0x{packet.Opcode:X04})"); Hexdump(packet.Data); break; } } catch (Exception e) { UnityEngine.Debug.LogError($"Failed to process {(ZoneOp) packet.Opcode} (0x{packet.Opcode:X04}):" + e.Message); } }
private void OnChatMessage(string[] data) { string fullMessage = data[1]; string[] chatData = fullMessage.Split(':'); if (fullMessage.Substring(0, 7) == "*GREEN*") { fullMessage = fullMessage.Substring(7); } else if (fullMessage.Substring(0, 5) == "*RED*") { fullMessage = fullMessage.Substring(5); } else if (fullMessage.Substring(0, 6) == "*BLUE*") { fullMessage = fullMessage.Substring(6); } else if (fullMessage.Substring(0, 8) == "*YELLOW*") { fullMessage = fullMessage.Substring(8); } else if (fullMessage.Substring(0, 6) == "*CYAN*") { fullMessage = fullMessage.Substring(6); } else if (fullMessage.Substring(0, 7) == "*WHITE*") { fullMessage = fullMessage.Substring(7); } string message; if (chatData.Length <= 1) { string channelName; int start = fullMessage.IndexOf('(') + 1; int end = fullMessage.IndexOf(')'); channelName = fullMessage.Substring(start, end - start); message = fullMessage.Substring(end + 2); ChannelSystemMessage?.Invoke(channelName, message); return; } if (chatData[0] != "*GREEN*System") { string channelName = null; string mode = null; string author; int start = (fullMessage[0] == '(' ? 1 : 0); int end; if (start != 0) { end = fullMessage.IndexOf(')'); channelName = fullMessage.Substring(start, end - start); } start = fullMessage.IndexOf('[') + 1; if (start != 0 && fullMessage.ToCharArray()[start] != 'n') { end = fullMessage.IndexOf(']'); mode = fullMessage.Substring(start, end - start); } if (channelName == "PM") { end = fullMessage.IndexOf(':'); string header = fullMessage.Substring(0, end); start = header.LastIndexOf(' ') + 1; author = header.Substring(start); } else { start = fullMessage[0] == '(' ? fullMessage.IndexOf(")") + 2 : 0; end = fullMessage.IndexOf(":"); author = fullMessage.Substring(start, end - start); } start = fullMessage.IndexOf(':') + 2; message = fullMessage.Substring(start == 1 ? 0 : start); if (channelName != null) { ChannelMessage?.Invoke(channelName, mode, author, message); } else { ChatMessage?.Invoke(mode, author, message); } return; } int offset = fullMessage.IndexOf(':') + 2; message = fullMessage.Substring(offset == 1 ? 0 : offset); SystemMessage?.Invoke(message); }