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 ? "" : "" ) })); }
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)); } }
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); }
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 ? "" : "") })); }
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)); } } }
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); } }
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" })); }
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); }
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"); }