Example #1
0
        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);
        }
Example #2
0
        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;
            }
        }
Example #3
0
        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);
            }
        }
Example #4
0
        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);
        }