Exemplo n.º 1
0
        public static void evt_recv_join(Bot bot, dAmnPacket packet)
        {
            if (packet.Parameter.StartsWith("pchat:"))
            {
                ConIO.Write(String.Format("** {0} joined.", packet.SubParameter));

                if (BDS.syncing && packet.Parameter.StartsWith("pchat:") && packet.SubParameter.ToLower() == BDS.syncwith)
                {
                    BDS.syncwatch = Stopwatch.StartNew();
                    bot.NPSay(packet.Parameter, "BDS:SYNC:BEGIN");
                }

                return;
            }

            if (packet.Parameter == "chat:DataShare")
            {
                BDS.ToggleOnline(packet.SubParameter);
            }

            // Due to the odd format of this packet, arguments are pushed to the body.
            packet.PullBodyArguments();

            // Don't display DataShare messages.
            if (!Program.NoDisplay.Contains(Tools.FormatNamespace(packet.Parameter.ToLower(), Types.NamespaceFormat.Channel)))
            {
                ConIO.Write(String.Format("** {0}{1} joined. [{2}]", packet.Arguments["symbol"], packet.SubParameter, packet.Arguments["pc"]), Tools.FormatChat(packet.Parameter));

                lock (BDS._seen_database)
                {
                    if (BDS._seen_database.ContainsKey(packet.SubParameter.ToLower()))
                    {
                        BDS._seen_database[packet.SubParameter.ToLower()].Channel = packet.Parameter;
                        BDS._seen_database[packet.SubParameter.ToLower()].Type = (byte)Types.SeenType.Joining;
                        BDS._seen_database[packet.SubParameter.ToLower()].Timestamp = Bot.EpochTimestamp;
                    }
                    else
                    {
                        BDS._seen_database.Add(packet.SubParameter.ToLower(), new SeenInfo()
                        {
                            Name = packet.SubParameter,
                            Channel = packet.Parameter,
                            Type = (byte)Types.SeenType.Joining,
                            Timestamp = Bot.EpochTimestamp
                        });
                    }
                }
            }

            // Police bot stuff.
            if ((packet.Parameter == "chat:DSGateway" || packet.Parameter == "chat:DataShare") && BDS.IsPoliceBot(bot.Config.Username, packet.Parameter))
            {
                if (!BDS.GateChecks.Contains(packet.SubParameter))
                {
                    bot.NPSay(packet.Parameter, "BDS:BOTCHECK:DIRECT:" + packet.SubParameter);

                    BDS.ClearKickTimers(packet.SubParameter);
                    BDS.KickAfter(packet.Parameter, packet.SubParameter, 30, "No response to or invalid BDS:BOTCHECK. If you are not a bot, please do not join this room. Thanks.");
                }
                else BDS.GateChecks.Remove(packet.SubParameter);
            }

            // Update channel data
            lock (ChannelData[packet.Parameter.ToLower()])
            {
                if (!ChannelData[packet.Parameter.ToLower()].Members.ContainsKey(packet.SubParameter.ToLower()))
                {
                    Types.ChatMember member = new Types.ChatMember();

                    member.Name = packet.SubParameter;
                    member.Privclass = packet.Arguments["pc"];
                    member.RealName = packet.Arguments["realname"];
                    member.Symbol = packet.Arguments["symbol"];
                    member.GPC = packet.Arguments["gpc"];
                    member.ConnectionCount = 1;

                    ChannelData[packet.Parameter.ToLower()].Members.Add(member.Name.ToLower(), member);
                }
                else
                {
                    ChannelData[packet.Parameter.ToLower()].Members[packet.SubParameter.ToLower()].ConnectionCount++;
                }
            }
        }
Exemplo n.º 2
0
        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>&raquo;</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>&raquo; Connection #{0}</b><br/> <b>&middot; Online:</b> {1}<br/> <b>&middot; Idle:</b> {2}<br/> <b>&middot; 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);
                        }
                    }
                }
            }
        }