public static void evt_recv_admin(Bot bot, dAmnPacket packet) { String cmdchan = String.Empty; if (packet.Arguments.ContainsKey("by") && packet.Arguments["by"].ToLower() == bot.Config.Username.ToLower()) { lock (CommandChannels["send"]) { if (CommandChannels["send"].Count > 0) { cmdchan = CommandChannels["send"][0]; CommandChannels["send"].RemoveAt(0); // No need to display this. } } } lock (ChannelData[packet.Parameter.ToLower()]) { if (packet.SubParameter == "create") { // Don't display DataShare messages. if (!Program.NoDisplay.Contains(Tools.FormatNamespace(packet.Parameter.ToLower(), Types.NamespaceFormat.Channel))) ConIO.Write(String.Format("*** {0} created privclass {1} with: {2}", packet.Arguments["by"], packet.Arguments["name"], packet.Arguments["privs"]), Tools.FormatChat(packet.Parameter)); // Update channel data if (!ChannelData[packet.Parameter.ToLower()].Privclasses.ContainsKey(packet.Arguments["name"].ToLower())) { Types.Privclass privclass = new Types.Privclass(); privclass.Name = packet.Arguments["name"]; // Gotta extract the order! int order_pos = packet.Arguments["privs"].IndexOf("order=") + 6; int sp_pos = packet.Arguments["privs"].IndexOf(' ', order_pos); // No space? It was only the order then if (sp_pos == -1) sp_pos = packet.Arguments["privs"].Length - (order_pos - 6); privclass.Order = Convert.ToByte(packet.Arguments["privs"].Substring(order_pos, sp_pos - order_pos)); ChannelData[packet.Parameter.ToLower()].Privclasses.Add(privclass.Name.ToLower(), privclass); } } else if (packet.SubParameter == "update") { // Don't display DataShare messages. if (!Program.NoDisplay.Contains(Tools.FormatNamespace(packet.Parameter.ToLower(), Types.NamespaceFormat.Channel))) ConIO.Write(String.Format("*** {0} updated privclass {1} with: {2}", packet.Arguments["by"], packet.Arguments["name"], packet.Arguments["privs"]), Tools.FormatChat(packet.Parameter)); // Update channel data if (ChannelData[packet.Parameter.ToLower()].Privclasses.ContainsKey(packet.Arguments["name"].ToLower())) { // Gotta extract the order! int order_pos = packet.Arguments["privs"].IndexOf("order="); if (order_pos == -1) return; order_pos += 6; int sp_pos = packet.Arguments["privs"].IndexOf(' ', order_pos); // No space? It was only the order then if (sp_pos == -1) sp_pos = packet.Arguments["privs"].Length - (order_pos - 6); ChannelData[packet.Parameter.ToLower()].Privclasses[packet.Arguments["name"].ToLower()].Order = Convert.ToByte(packet.Arguments["privs"].Substring(order_pos, sp_pos - order_pos)); } } else if (packet.SubParameter == "rename") { // Don't display DataShare messages. if (!Program.NoDisplay.Contains(Tools.FormatNamespace(packet.Parameter.ToLower(), Types.NamespaceFormat.Channel))) ConIO.Write(String.Format("*** {0} renamed privclass {1} to {2}", packet.Arguments["by"], packet.Arguments["prev"], packet.Arguments["name"]), Tools.FormatChat(packet.Parameter)); // Update channel data if (ChannelData[packet.Parameter.ToLower()].Privclasses.ContainsKey(packet.Arguments["prev"].ToLower())) { Types.Privclass privclass = ChannelData[packet.Parameter.ToLower()].Privclasses[packet.Arguments["prev"].ToLower()]; privclass.Name = packet.Arguments["name"]; ChannelData[packet.Parameter.ToLower()].Privclasses.Add(privclass.Name.ToLower(), privclass); ChannelData[packet.Parameter.ToLower()].Privclasses.Remove(packet.Arguments["prev"].ToLower()); } } else if (packet.SubParameter == "move") { // Don't display DataShare messages. if (!Program.NoDisplay.Contains(Tools.FormatNamespace(packet.Parameter.ToLower(), Types.NamespaceFormat.Channel))) ConIO.Write(String.Format("*** {0} moved all users of privclass {1} to {2}. {3} user(s) were affected", packet.Arguments["by"], packet.Arguments["prev"], packet.Arguments["name"], packet.Arguments["n"]), Tools.FormatChat(packet.Parameter)); } else if (packet.SubParameter == "remove") { // Don't display DataShare messages. if (!Program.NoDisplay.Contains(Tools.FormatNamespace(packet.Parameter.ToLower(), Types.NamespaceFormat.Channel))) ConIO.Write(String.Format("*** {0} removed privclass {1}. {2} user(s) were affected", packet.Arguments["by"], packet.Arguments["name"], packet.Arguments["n"]), Tools.FormatChat(packet.Parameter)); // Update channel data if (ChannelData[packet.Parameter.ToLower()].Privclasses.ContainsKey(packet.Arguments["name"].ToLower())) { ChannelData[packet.Parameter.ToLower()].Privclasses.Remove(packet.Arguments["name"].ToLower()); } } else if (packet.SubParameter == "privclass") { // Don't display DataShare messages. if (!Program.NoDisplay.Contains(Tools.FormatNamespace(packet.Parameter.ToLower(), Types.NamespaceFormat.Channel))) ConIO.Write(String.Format("*** Failed to {0} privclass: {1}", packet.Arguments["p"], packet.Arguments["e"]), Tools.FormatChat(packet.Parameter)); lock (CommandChannels["send"]) { if (CommandChannels["send"].Count > 0) { cmdchan = CommandChannels["send"][0]; CommandChannels["send"].RemoveAt(0); } } if (cmdchan != String.Empty) bot.Say(cmdchan, String.Format("<b>» Failed to {0} privclass:</b> {1}<br/><br/><b>Command was:</b> <bcode>'{2}'</bcode>", packet.Arguments["p"], packet.Arguments["e"], packet.Body)); } else if (packet.SubParameter == "show") { lock (CommandChannels["send"]) { if (CommandChannels["send"].Count > 0) { cmdchan = CommandChannels["send"][0]; CommandChannels["send"].RemoveAt(0); } } Events.CallEvent("evt_recv_admin_show", packet); if (cmdchan != String.Empty) bot.Say(cmdchan, String.Format("<b>» Showing {0} of {1}:</b><br/><code>'{2}'</code>", packet.Arguments["p"], Tools.FormatChat(packet.Parameter), packet.Body)); } } }
public static void evt_property(Bot bot, dAmnPacket packet) { // Only output this in debug mode. if (Program.Debug && !Program.NoDisplay.Contains(Tools.FormatNamespace(packet.Parameter.ToLower(), Types.NamespaceFormat.Channel))) ConIO.Write(String.Format("*** Got {0}", packet.Arguments["p"]), Tools.FormatChat(packet.Parameter)); // Store data String ns = packet.Parameter; String type = packet.Arguments["p"]; if (ns.StartsWith("pchat:")) return; lock (ChannelData) { if (!ChannelData.ContainsKey(ns.ToLower())) { ChannelData.Add(ns.ToLower(), new Types.ChatData()); ChannelData[ns.ToLower()].Name = ns; } } lock (ChannelData[ns.ToLower()]) { if (type == "topic") { ChannelData[ns.ToLower()].Topic = packet.Body; Bot.Logger.LogProperty(Tools.FormatChat(packet.Parameter), "topic", packet.Body); } else if (type == "title") { ChannelData[ns.ToLower()].Title = packet.Body; Bot.Logger.LogProperty(Tools.FormatChat(packet.Parameter), "title", packet.Body); } else if (type == "privclasses") { // Ensure we don't run into duplicates. ChannelData[ns.ToLower()].Privclasses.Clear(); foreach (String pc in packet.Body.Split('\n')) { if (pc.Length < 3 || !pc.Contains(":")) continue; Types.Privclass privclass = new Types.Privclass(); privclass.Order = Convert.ToByte(pc.Split(':')[0]); privclass.Name = pc.Split(':')[1]; ChannelData[ns.ToLower()].Privclasses.Add(privclass.Name.ToLower(), privclass); } } else if (type == "members") { // Ensure we don't run into duplicates. ChannelData[ns.ToLower()].Members.Clear(); String[] data = packet.Body.Split('\n'); var who = ""; for (int x = 0; x < data.Length; x++) { if (data[x].Length < 3 || !data[x].StartsWith("member") || x + 6 >= data.Length) continue; Types.ChatMember member = new Types.ChatMember(); member.Name = data[x].Substring(7); who = member.Name.ToLower(); // We get duplicates on multiple connections. if (ChannelData[ns.ToLower()].Members.ContainsKey(who)) { ChannelData[ns.ToLower()].Members[who].ConnectionCount++; continue; } member.Privclass = data[++x].Substring(3); // We don't store the user icon. It's useless to us. Increment x anyway. ++x; member.Symbol = data[++x].Substring(7); member.RealName = data[++x].Substring(9); //member.TypeName = data[++x].Substring(9); member.GPC = data[++x].Substring(4); member.ConnectionCount = 1; ChannelData[ns.ToLower()].Members.Add(who, member); lock (BDS._seen_database) { if (BDS._seen_database.ContainsKey(who)) { BDS._seen_database[who].Channel = ns; BDS._seen_database[who].Type = (byte)Types.SeenType.None; BDS._seen_database[who].Timestamp = Bot.EpochTimestamp; } else { BDS._seen_database.Add(who, new SeenInfo() { Name = member.Name, Channel = ns, Type = (byte)Types.SeenType.None, Timestamp = Bot.EpochTimestamp }); } } // Increment x for the blank line. x++; } if (ns == "chat:DataShare") { foreach (var m in Core.ChannelData["chat:datashare"].Members.Keys) { BDS.ToggleOnline(m); } } } else if (type == "info") { WhoisData wd = new WhoisData(); String[] data = packet.Body.Split(new char[] { '\n' }); // Don't parse what we don't need! // Icon is 0 wd.Name = packet.Parameter.Substring(6); //wd.Symbol = data[1].Substring(7); wd.RealName = data[2].Substring(9); //wd.TypeName = data[3].Substring(9); wd.GPC = data[3].Substring(4); int conID = 0; wd.Connections.Add(new WhoisConnection()); for (int i = 6; i < data.Length; i++) { if (data[i] == "conn") { conID++; wd.Connections.Add(new WhoisConnection() { ConnectionID = conID }); } else if (data[i].StartsWith("online=")) ulong.TryParse(data[i].Substring(7), out wd.Connections[conID].Online); else if (data[i].StartsWith("idle=")) ulong.TryParse(data[i].Substring(5), out wd.Connections[conID].Idle); else if (data[i].StartsWith("ns ") && data[i] != "ns chat:DataShare") wd.Connections[conID].Channels.Add("#" + data[i].Substring(8)); } Events.CallSpecialEvent("whois", new object[] { wd }); lock (CommandChannels["whois"]) { if (CommandChannels["whois"].Count > 0) { String chan = CommandChannels["whois"][0]; CommandChannels["whois"].RemoveAt(0); String output = String.Format("<b>»</b> :icon{0}: :dev{0}:<br/><br/>", wd.Name); output += String.Format("<i>{0}</i><br/>{1}", wd.RealName, wd.GPC == "guest" ? "" : "<b>dAmn " + wd.GPC + "</b><br/>"); foreach (WhoisConnection wc in wd.Connections) { wc.Channels.Sort(); output += String.Format("<br/><b>» Connection #{0}</b><br/> <b>· Online:</b> {1}<br/> <b>· Idle:</b> {2}<br/> <b>· Channels:</b> <b>[</b>{3}<b>]</b><br/>", wc.ConnectionID + 1, Tools.FormatTime(wc.Online), Tools.FormatTime(wc.Idle), String.Join("<b>]</b>, <b>[</b>", wc.Channels)); } bot.Say(chan, output); } } } } }