Пример #1
0
 /// <summary>
 /// 消息提示
 /// </summary>
 /// <param name="msg"></param>
 public void _mClient_OnNotice(Model.Entity.Message msg)
 {
     OnNotice?.Invoke(msg);
     //ServiceNotice serviceNotice = new ServiceNotice();
     //serviceNotice.StartPosition = FormStartPosition.CenterParent;
     //serviceNotice.Notice.Text = Encoding.UTF8.GetString(msg.Data);
     //serviceNotice.ShowDialog();
 }
Пример #2
0
 /// <summary>
 /// Open a notification box
 /// </summary>
 /// <param name="config"></param>
 public void Open([NotNull] NotificationConfig config)
 {
     if (config == null)
     {
         return;
     }
     OnNotice?.Invoke(config);
 }
Пример #3
0
        protected override void ReciveMessage(Message message)
        {
            if (message.IsMessage((int)SOAMessageType.SOANoticeClientMessage))
            {
                var notice = message.GetMessageBody <Contract.SOANoticeClientMessage>();
                if (OnNotice != null)
                {
                    OnNotice.BeginInvoke(notice, null, null);
                }
                return;
            }

            base.ReciveMessage(message);
        }
Пример #4
0
        public void WsInite()
        {
            ws.OnMessage += (sender, e) =>
            {
                if (e.Data != null)
                {
                    try
                    {
                        Message msg = SerializeHelper.Deserialize <Message>(e.Data);
                        if (msg != null)
                        {
                            switch (msg.Protocal)
                            {
                            case (byte)MessageProtocalEnum.Heart:
                                ActiveTime = DateTime.Now;
                                //OnNotice?.Invoke(new Message
                                //{
                                //    Data = Encoding.UTF8.GetBytes("心跳:"+ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff"))
                                //});
                                break;

                            case (byte)MessageProtocalEnum.RLogin:
                                this.OnLogined?.Invoke(this, Encoding.UTF8.GetString(msg.Data));
                                isLogin = true;
                                OnNotice?.Invoke(msg);
                                break;

                            case (byte)MessageProtocalEnum.RemoteConnect:
                                //var aa = Encoding.UTF8.GetString(msg.Data);
                                OnNotice?.Invoke(msg);
                                break;

                            default:
                                OnMessage?.Invoke(this, msg);
                                break;
                            }
                        }
                    }
                    catch
                    {
                    }
                }
                else
                {
                    Message msgFile = SerializeHelper.ProtolBufDeserialize <Message>(e.RawData);
                    if (msgFile.Protocal == (byte)MessageProtocalEnum.File)
                    {
                        OnFile?.Invoke(this, msgFile.Data, "1");
                    }
                    if (msgFile.Protocal == (byte)MessageProtocalEnum.FileSlice)
                    {
                        OnFile?.Invoke(this, msgFile.Data, "2");
                    }
                    OnNotice?.Invoke(new Message {
                        Data = Encoding.UTF8.GetBytes("接收到图片")
                    });
                }
            };

            ws.OnError += (sender, e) =>
            {
            };
            ws.OnClose += (sender, e) =>
            {
            };
            // ws.OnOpen += (sender, e) => ws.Send("name:Hi, there!");
        }
Пример #5
0
        private void OnMessage(Message m)
        {
            Event.Invoke(this, Event.ServerEventType.Message, m);
            switch (m.Command.ToUpper())
            {
            case "NOTICE":
                if (OnNotice != null)
                {
                    OnNotice.Invoke(this, m);
                }
                break;

            case "TOPIC":
                // --> :[email protected] TOPIC #davux :Test topic
            {
                Channel c = FindChannel(m.Target);
                if (c != null)
                {
                    c.ChangeTopic(new User(this, m.Prefix), m.ListString);
                }
                else
                {
                    Trace.WriteLine("IRC/Server/OnMessage/TOPIC: Invalid Channel for TOPIC: " + m);
                }
            }
            break;

            case "PRIVMSG":
                if (m.ListString == "\x001VERSION\x001")
                {
                    Notice(m.PrefixNick, "\x001VERSION irc.net ALPHA " + Assembly.GetExecutingAssembly().GetName().Version + " " + Environment.OSVersion.Platform + "\x001");
                }
                else if (m.Target.ToLower() == Nick.ToLower())
                {
                    Channel cf = FindChannel(m.PrefixNick);
                    User    u  = new User(this, m.Prefix);
                    if (cf != null)
                    {
                        cf.MessageRcv(u, m.ListString);
                    }
                    else
                    {
                        Channel cn = new Channel(this, m.PrefixNick);
                        Channels.Add(cn);
                        if (OnJoined != null)
                        {
                            OnJoined.Invoke(this, cn);
                        }
                        cn.MessageRcv(u, m.ListString);
                    }
                }
                else
                {
                    Channel cf = FindChannel(m.Target);
                    User    u  = new User(this, m.Prefix);
                    if (cf != null)
                    {
                        cf.MessageRcv(u, m.ListString);
                    }
                    else
                    {
                        Channel cn = new Channel(this, m.Target);
                        cn.MessageRcv(u, m.ListString);
                        Channels.Add(cn);
                        if (OnJoined != null)
                        {
                            OnJoined.Invoke(this, cn);
                        }
                    }
                }

                break;

            case "JOIN":
            {
                if (m.PrefixNick.ToLower() == Nick.ToLower())
                {
                    // i joined a channel!
                    Channel c = new Channel(this, m.Target);
                    if (OnJoined != null)
                    {
                        OnJoined.Invoke(this, c);
                        // Thread.Sleep(1000);
                    }
                    Channels.Add(c);
                }
                else
                {
                    // someone joined a channel that im on
                    Channel c = FindChannel(m.Target);
                    if (c != null)
                    {
                        User ux = new User(this, m.Prefix);
                        if (ux != null)
                        {
                            c.JoinUser(ux, true);
                        }
                        else
                        {
                            Trace.WriteLine("IRC/Server/OnMessage: Invalid User for JOIN: " + m);
                        }
                    }
                    else
                    {
                        Trace.WriteLine("IRC/Server/OnMessage: Invalid Channel for JOIN: " + m);
                    }
                }
                break;
            }

            case "376":
                if (OnStatusMessage != null)
                {
                    OnStatusMessage.Invoke(this, m);
                }
                if (!autoJoined)
                {
                    autoJoined = true;
                    if (OnConnected != null)
                    {
                        OnConnected.Invoke(this);
                    }
                    JoinAutoChannels();
                }
                break;

            case "005":
            {
                string[] parts = m.AfterCommandString.Split(' ');

                foreach (string p in parts)
                {
                    if (p.ToUpper().StartsWith("NETWORK="))
                    {
                        // p is network
                        Network = p.Remove(0, 8);
                    }
                    else if (p.ToUpper().StartsWith("PREFIX="))
                    {
                        ChannelModes = new ChannelModes(p.Remove(0, 7));
                    }
                }
            }
            break;

            case "MODE":
                // :DaveTest MODE DaveTest :+iwx
                // :irc.aohell.org MODE #davux +nt
                if (!autoJoined)
                {
                    autoJoined = true;
                    if (OnConnected != null)
                    {
                        OnConnected.Invoke(this);
                    }
                    JoinAutoChannels();
                }

                if (m.Target == Nick)
                {
                    // TODO own modes
                    ParseOwnModes(m.ListString);
                }
                else if (m.TargetIsChannel)
                {
                    // setting chan modes
                    Channel ct = FindChannel(m.Target);

                    if (ct != null)
                    {
                        User u = ct.FindUser(m.PrefixNick);
                        if (u != null)
                        {
                            u.SetMask(m.Prefix);
                        }
                        else
                        {
                            u = new User(this, m.Prefix);
                        }
                        ct.SetModes(u, m.AfterCommandString.Substring(m.AfterCommandString.IndexOf(' ')).Trim());
                    }
                    else
                    {
                        Trace.WriteLine("IRC/Server/OnMessage: Invalid Channel to MODE: " + m);
                    }
                }
                break;

            case "KICK":
                // --> :[email protected] KICK #davux DavXn :DavX-
            {
                Channel c      = FindChannel(m.Target);
                User    kicker = c.FindUser(m.PrefixNick);
                User    kicked = c.FindUser(m.Arg2);

                if (kicker == null || kicked == null)
                {
                    Trace.WriteLine("IRC/Server/OnMessage/KICK: No kicker or kicked " + m);
                }
                else
                {
                    if (c != null)
                    {
                        c.KickUser(kicked, kicker, m.ListString);
                    }
                    else
                    {
                        Trace.WriteLine("IRC/Server/OnMessage/KICK No Channel: " + m);
                    }
                }
            }
            break;

            case "PART":
                if (m.PrefixNick.ToLower() == Nick.ToLower())
                {
                    // i left a channel!
                    Channel c = FindChannel(m.Target);
                    if (c != null)
                    {
                        //c.Part();
                        Channels.Remove(c);
                        if (OnParted != null)
                        {
                            OnParted.Invoke(this, c);
                        }
                    }
                    else
                    {
                        Trace.WriteLine("IRC/Server/OnMessage: Invalid Channel for PART: " + m);
                    }
                }
                else
                {
                    // someone left a channel that im on
                    Channel c = FindChannel(m.Target);
                    if (c != null)
                    {
                        User ud = c.FindUser(m.PrefixNick);
                        ud.SetMask(m.Prefix);
                        if (ud != null)
                        {
                            c.PartUser(ud, m.ListString, true);
                        }
                        else
                        {
                            Trace.WriteLine("IRC/Server/OnMessage: Invalid User for PART: " + m);
                        }
                    }
                    else
                    {
                        Trace.WriteLine("IRC/Server/OnMessage: Invalid Channel for PART: " + m);
                    }
                }
                break;

            case "353":
            {
                string[] parts = m.ListString.Split(' ');

                Channel c = FindChannel(m.Arg3);
                if (c != null)
                {
                    foreach (string p in parts)
                    {
                        if (!string.IsNullOrEmpty(p))
                        {
                            string px = p;

                            if ("" != ChannelModes.ModeForSymbol(px.Substring(0, 1)))
                            {
                                px = px.Remove(0, 1);
                            }
                            bool add = true;
                            foreach (User u in c.Users)
                            {
                                if (u.Nick.ToLower() == px)
                                {
                                    add = false;
                                    break;
                                }
                            }
                            if (add)
                            {
                                c.JoinUser(new User(this, p), false);
                            }
                        }
                    }
                }
                else
                {
                    Trace.WriteLine("IRC/Server/OnMessage/353: Invalid Channel: " + m);
                }
            }
            break;

            // --> :irc.aohell.org 332 DavXn #davux :This is the topic message
            // --> :irc.aohell.org 333 DavXn #davux DavX- 1260079684
            case "332":
            {
                Channel chan = FindChannel(m.Arg2);
                if (chan != null)
                {
                    chan.Topic = m.ListString;
                }
                else
                {
                    Trace.WriteLine("IRC/Server/OnMessage/332: Invalid channel: " + m);
                }
            }
            break;

            case "333":
            {
                Channel c = FindChannel(m.Arg2);
                if (c != null)
                {
                    User u = new User(this, m.Arg3);
                    c.TopicDetails(u, m.Arg4);
                }
                else
                {
                    Trace.WriteLine("IRC/Server/OnMessage/333: Invalid channel: " + m);
                }
            }
            break;

            case "366":
                // no action.
                break;

            case "433":
                // --> :irc.redwolfs.net 433 * DavXn :Nickname is already in use.
                if (OnStatusMessage != null)
                {
                    OnStatusMessage.Invoke(this, m);
                }
                Send("NICK " + Profile.GetNick(m.Arg2));
                break;

            case "NICK":
            {
                string oldNick = m.PrefixNick;
                string newNick = m.Target;

                if (oldNick.ToLower() == Nick.ToLower())
                {
                    Nick = newNick;
                }

                foreach (Channel c in Channels)
                {
                    c.NickChanged(oldNick, newNick);
                }


                /*
                 * if (OnNickChanged != null)
                 * {
                 *  OnNickChanged.Invoke(oldNick, newNick);
                 * }
                 */
            }
            break;

            case "001":
                if (m.Target != Nick)
                {
                    string oldNick = Nick;
                    Nick = m.Target;
                    if (OnNickChanged != null)
                    {
                        OnNickChanged.Invoke(oldNick, Nick);
                    }
                }
                if (OnStatusMessage != null)
                {
                    OnStatusMessage.Invoke(this, m);
                }
                break;

            case "QUIT":
                // :[email protected] QUIT :Quit: Clfloat
            {
                User u = new User(this, m.Prefix);

                if (OnUserQuit != null)
                {
                    OnUserQuit(this, u, m.ListString);
                }

                foreach (Channel c in Channels)
                {
                    c.UserQuit(u, m.ListString);
                }
            }
            break;

            default:
                if (OnStatusMessage != null)
                {
                    OnStatusMessage.Invoke(this, m);
                }
                break;
            }
        }