示例#1
0
        private void FriendMessage(FriendChatMsg_t message)
        {
            if (message.m_ulSender == clientUser.GetSteamID())
            {
                return;
            }
            IClient cl = GetSteamClient(message.m_ulSender);

            if (cl == null)
            {
                if (clientList.Clients.ContainsKey(message.m_ulSender))
                {
                    cl = clientList.Clients[message.m_ulSender];
                }
                else
                {
                    cl = new SteamClient(message.m_ulSender);
                }

                clients.Add(cl);
                GetChannel("&Friends").AddClient(cl);
            }

            byte[]         msg     = new byte[4096];
            EChatEntryType type    = EChatEntryType.k_EChatEntryTypeInvalid;
            ulong          chatter = 0;

            int len = clientFriends.GetChatMessage(message.m_ulSender, (int)message.m_iChatID, msg, 4096, ref type, ref chatter);

            len--;

            if (type != EChatEntryType.k_EChatEntryTypeChatMsg && type != EChatEntryType.k_EChatEntryTypeEmote)
            {
                return;
            }

            byte[] a = new byte[len];
            Array.Copy(msg, a, len);

            string[] Messs = Encoding.UTF8.GetString(a).Split(new char[] { '\n' });

            foreach (string Mess in Messs)
            {
                foreach (IClient cli in clients)
                {
                    if (cli.GetType().Equals(typeof(IRCClient)))
                    {
                        cl.AddMessage(IRCMessage.GetStatic().CreateMessage(cl, cl.UserString, "PRIVMSG", new string[] { cli.NickName, (type == EChatEntryType.k_EChatEntryTypeEmote ? "ACTION " : "") + Mess + (type == EChatEntryType.k_EChatEntryTypeEmote ? "" : "") }));
                    }
                }
            }
            //cl.SendMessage(Message.CreateMessage(GetClient(message.m_ulSender), GetClient(message.m_ulSender).UserString, "PRIVMSG", new string[] { client.NickName, "" + (type == EChatEntryType.k_EChatEntryTypeEmote ? "ACTION " : "") + Mess + (type == EChatEntryType.k_EChatEntryTypeEmote ? "" : "" ) }));
        }
示例#2
0
        private void StateChange(PersonaStateChange_t change)
        {
            IClient cl;

            if (change.m_nChangeFlags == EPersonaChange.k_EPersonaChangeComeOnline)
            {
                cl = new SteamClient(change.m_ulSteamID);
                clients.Add(cl);
                Database.GetDatabase().GetChannel("Friends").AddClient(cl);
            }
            else if (change.m_nChangeFlags == EPersonaChange.k_EPersonaChangeGoneOffline)
            {
                cl = GetSteamClient(change.m_ulSteamID);
                if (cl != null)
                {
                    cl.Dispose();
                }
            }
            else if (change.m_nChangeFlags == EPersonaChange.k_EPersonaChangeName)
            {
                cl = GetSteamClient(change.m_ulSteamID);

                if (cl != null)
                {
                    cl.RealName = clientFriends.GetFriendPersonaName(change.m_ulSteamID);

                    if (!clientList.Clients.ContainsKey(change.m_ulSteamID))
                    {
                        cl.AddMessage(IRCMessage.GetStatic().CreateMessage(cl, "NICK " + StripString(cl.RealName)));
                    }
                    //Server.GetChannel("Friends").SendMessage(Message.CreateMessage(cl, cl.UserString, "NICK", new string[] { StripString(cl.RealName) }));
                    //cl.NickName = StripString(cl.RealName);
                }
            }
            else if (change.m_nChangeFlags == EPersonaChange.k_EPersonaChangeStatus)
            {
                EPersonaState st = clientFriends.GetFriendPersonaState(change.m_ulSteamID);
                cl = GetSteamClient(change.m_ulSteamID);

                if (cl != null)
                {
                    if (st == EPersonaState.k_EPersonaStateOffline)
                    {
                        cl.Dispose();
                    }
                    else
                    {
                        cl.AddMessage(IRCMessage.GetStatic().CreateMessage(cl, cl.UserString, "AWAY", new string[] { (st == EPersonaState.k_EPersonaStateOnline ? "" : st.ToString().Remove(0, 15)) }));
                    }
                }
                //cl.AwayMsg = (st == EPersonaState.k_EPersonaStateOnline ? "" : st.ToString().Remove(0, 15));
            }
        }
示例#3
0
        public virtual void KickClient(IClient c, IClient kicker, string message)
        {
            if (!clients.Contains(c) || !(clients.Contains(kicker) && ClientModes[kicker].Contains('o')))
            {
                return;
            }

            SendMessage(c, IRCMessage.GetStatic().CreateMessage(kicker, kicker.UserString, "KICK", new string[] { "&" + ChannelName, c.NickName, message }), true);

            clients.Remove(c);
            ClientModes.Remove(c);
        }
示例#4
0
        private void ChatMessage(ChatRoomMsg_t message)
        {
            if (message.m_ulSteamIDUser == clientUser.GetSteamID())
            {
                return;
            }

            IChannel ch = GetSteamChannel(message.m_ulSteamIDChat);

            if (ch == null)
            {
                return;
            }

            byte[]         msg  = new byte[4096];
            EChatEntryType type = EChatEntryType.k_EChatEntryTypeInvalid;

            int len = clientFriends.GetChatRoomEntry(message.m_ulSteamIDChat, (int)message.m_iChatID, ref message.m_ulSteamIDUser, msg, 4096, ref type);

            len--;

            if (type != EChatEntryType.k_EChatEntryTypeChatMsg && type != EChatEntryType.k_EChatEntryTypeEmote)
            {
                return;
            }

            byte[] a = new byte[len];
            Array.Copy(msg, a, len);

            string[] Messs = Encoding.UTF8.GetString(a).Split(new char[] { '\n' });
            IClient  cl    = GetSteamClient(message.m_ulSteamIDUser);

            if (cl == null)
            {
                if (clientList.Clients.ContainsKey(message.m_ulSteamIDUser))
                {
                    cl = clientList.Clients[message.m_ulSteamIDUser];
                }
                else
                {
                    cl = new SteamClient(message.m_ulSteamIDUser);
                }
                clients.Add(cl);
                ch.AddClient(cl);
            }

            foreach (string Mess in Messs)
            {
                cl.AddMessage(IRCMessage.GetStatic().CreateMessage(cl, cl.UserString, "PRIVMSG", new string[] { "&" + ch.ChannelName, (type == EChatEntryType.k_EChatEntryTypeEmote ? "ACTION " : "") + Mess + (type == EChatEntryType.k_EChatEntryTypeEmote ? "" : "") }));
            }
            //ch.SendMessage(Message.CreateMessage(cl, cl.UserString, "PRIVMSG", new string[] { "&" + Server.StripString(clientFriends.GetChatRoomName(message.m_ulSteamIDChat)), "" + (type == EChatEntryType.k_EChatEntryTypeEmote ? "ACTION " : "") + Mess + (type == EChatEntryType.k_EChatEntryTypeEmote ? "" : "") }));
        }
示例#5
0
        private void ChatInvite(ChatRoomInvite_t invite)
        {
            Channel c = new ChatChannel(invite.m_ulSteamIDChat);

            channels.Add(c);

            foreach (IClient cl in clients)
            {
                if (cl.GetType() == typeof(IRCClient))
                {
                    cl.AddMessage(IRCMessage.GetStatic().CreateMessage(cl, "JOIN &" + c.ChannelName));
                }
            }
        }
示例#6
0
        private void ChatResult(ChatMemberStateChange_t entry)
        {
            EChatMemberStateChange ch = entry.m_rgfChatMemberStateChange;

            if (ch == EChatMemberStateChange.k_EChatMemberStateChangeEntered)
            {
                IClient cl = GetSteamClient(entry.m_ulSteamIDUserChanged);

                if (cl == null)
                {
                    if (clientList.Clients.ContainsKey(entry.m_ulSteamIDUserChanged))
                    {
                        cl = clientList.Clients[entry.m_ulSteamIDUserChanged];
                    }
                    else
                    {
                        cl = new SteamClient(entry.m_ulSteamIDUserChanged);
                    }

                    EPersonaState st = clientFriends.GetFriendPersonaState(entry.m_ulSteamIDUserChanged);
                    cl.AwayMsg = (st == EPersonaState.k_EPersonaStateOnline ? "" : st.ToString().Remove(0, 15));
                    clients.Add(cl);
                }

                cl.AddMessage(IRCMessage.GetStatic().CreateMessage(cl, cl.UserString, "JOIN", new string[] { "&" + GetSteamChannel(entry.m_ulSteamIDChat).ChannelName }));

                /*Channel c = GetChannel(Server.StripString(clientFriends.GetChatRoomName(entry.m_ulSteamIDChat)));
                 * c.AddClient(cl);*/
            }
            else if (ch == EChatMemberStateChange.k_EChatMemberStateChangeLeft || ch == EChatMemberStateChange.k_EChatMemberStateChangeKicked || ch == EChatMemberStateChange.k_EChatMemberStateChangeDisconnected || ch == EChatMemberStateChange.k_EChatMemberStateChangeBanned)
            {
                IChannel c = GetSteamChannel(entry.m_ulSteamIDChat);

                IClient cl = GetSteamClient(entry.m_ulSteamIDUserChanged);

                if (cl == null || c == null)
                {
                    return;
                }

                string leaveMsg = entry.m_rgfChatMemberStateChange.ToString();

                if (leaveMsg.Length > 24)
                {
                    leaveMsg = leaveMsg.Remove(0, 24);
                }

                c.RemoveClient(cl, leaveMsg);
            }
        }
示例#7
0
        public virtual void AddClient(IClient c)
        {
            if (clients.Contains(c))
            {
                return;
            }

            clients.Add(c);

            if (!ClientModes.ContainsKey(c))
            {
                ClientModes.Add(c, "");
            }

            SendMessage(c, IRCMessage.GetStatic().CreateMessage(c, (ClientModes[c].Contains('o') ? "@" : "") + c.UserString, "JOIN", new string[] { "&" + ChannelName }), true);

            if (!string.IsNullOrEmpty(Topic))
            {
                c.SendMessage(IRCMessage.GetStatic().CreateMessage(c, BaseIRCLib.Server.GetServer().HostString, Reply.RPL_TOPIC, new string[] { c.NickName, "&" + ChannelName, "" + Topic }));
            }

            int currentNick = 0;

            string names = "";

            while (currentNick < clients.Count)
            {
                names += (ClientModes.ContainsKey(clients[currentNick]) && ClientModes[clients[currentNick]].Contains("o") ? "@" : (ClientModes.ContainsKey(clients[currentNick]) && ClientModes[clients[currentNick]].Contains("v") ? "+" : "")) + clients[currentNick].NickName + " ";

                currentNick++;

                if (names.Length > 480)
                {
                    names = names.Substring(0, names.Length - 1);

                    c.SendMessage(IRCMessage.GetStatic().CreateMessage(c, BaseIRCLib.Server.GetServer().HostString, Reply.RPL_NAMREPLY, new string[] { c.NickName, "=", "&" + ChannelName, names }));

                    names = "";
                }
            }

            if (!string.IsNullOrEmpty(names))
            {
                c.SendMessage(IRCMessage.GetStatic().CreateMessage(c, BaseIRCLib.Server.GetServer().HostString, Reply.RPL_NAMREPLY, new string[] { c.NickName, "=", "&" + ChannelName, names }));
            }

            c.SendMessage(IRCMessage.GetStatic().CreateMessage(c, BaseIRCLib.Server.GetServer().HostString, Reply.RPL_ENDOFNAMES, new string[] { c.NickName, "&" + ChannelName, "End of NAMES list" }));
        }
示例#8
0
        public virtual void RemoveClient(IClient c, string message)
        {
            if (!clients.Contains(c))
            {
                return;
            }

            SendMessage(c, IRCMessage.GetStatic().CreateMessage(c, c.UserString, "PART", new string[] { "&" + ChannelName, message }), true);

            if (!clients.Contains(c))
            {
                return;
            }

            clients.Remove(c);
            ClientModes.Remove(c);
        }
示例#9
0
        private void Work()
        {
            Console.WriteLine("Work thread begun");

            while (running)
            {
                if (server.Pending())
                {
                    IRCClient cl = new IRCClient(server.AcceptTcpClient());

                    clients.Add(cl);
                    Console.WriteLine("Recieved connection from {0}", clients[clients.Count - 1].HostName);
                }
                else if (clientList.NeedsToBeSaved)
                {
                    foreach (KeyValuePair <ulong, SteamClient> c in clientList.Clients)
                    {
                        if (c.Value.HasMessage())
                        {
                            IMessage m = c.Value.GetMessage();
                            Server.IRCCommands.CallCommand(m);
                        }
                    }

                    clientList.Save("clients.list");
                }
                else
                {
                    IClient[] clientDupe = clients.ToArray();
                    foreach (IClient c in clientDupe)
                    {
                        if (c == null)
                        {
                            continue;
                        }

                        if (c.IsDisposed)
                        {
                            Console.WriteLine("Client {0} disconnected: {1}", c.UserString, c.DisconnectMsg);
                            ClientHelpers.PartClient(c, c.DisconnectMsg);
                            clients.Remove(c);
                            continue;
                        }

                        if (c.HasMessage())
                        {
                            IMessage m = c.GetMessage();

                            if (m.IsCommand && IRCCommands.HasCommand(m.Command))
                            {
                                if (IRCCommands.ValidCommand(m.Command, m.Params.Length))
                                {
                                    IRCCommands.CallCommand(m);
                                    c.LastCommand = DateTime.Now;
                                }
                                else
                                {
                                    Console.WriteLine("Invalid command call: \"{0}\"", m.MessageString);
                                    c.SendMessage(IRCMessage.GetStatic().CreateMessage(c, c.NickName, Reply.ERR_UNKNOWNCOMMAND, new string[] { c.NickName, m.Command, "Wrong parameters" }));
                                }
                            }
                            else
                            {
                                Console.WriteLine("Unknown command: \"{0}\"", m.MessageString);
                                c.SendMessage(IRCMessage.GetStatic().CreateMessage(c, c.NickName, Reply.ERR_UNKNOWNCOMMAND, new string[] { c.NickName, m.Command, "Unknown command" }));
                            }
                        }

                        if (!c.Greeted && c.NickName != "*" && c.ClientType == ClientType.TYP_CLIENT)
                        {
                            ClientHelpers.MeetAndGreet(c);
                        }
                        else if (!c.Greeted && (DateTime.Now - c.LastCommand).TotalSeconds > 15)
                        {
                            c.Dispose("Never finished handshake");
                        }
                        else if (c.Greeted && (DateTime.Now - c.LastPing).TotalSeconds > 30)
                        {
                            c.LastPing = DateTime.Now;
                            c.SendMessage(IRCMessage.GetStatic().CreateMessage(c, null, "PING", new string[] { pingRandom.Next().ToString() }));
                            c.MissedPings++;
                        }
                        else if (c.Greeted && c.MissedPings > 5)
                        {
                            c.Dispose("Ping Timeout!");
                        }
                    }
                }

                Thread.Sleep(5);
            }

            Console.WriteLine("Work thread finished");
        }