示例#1
0
        public static bool DeleteChannel(Player player, ushort channelId)
        {
            switch (channelId)
            {
            case Constants.ChatChannelGuild:
                //Guild* guild = player.getGuild(); //TODO: GUILD
                //if (!guild) {
                //    return false;
                //}

                //auto it = guildChannels.find(guild->getId());
                //if (it == guildChannels.end()) {
                //    return false;
                //}

                //delete it->second;
                //guildChannels.erase(it);
                break;

            case Constants.ChatChannelParty:
                //Party* party = player.getParty(); //TODO: PARTY
                //if (!party) {
                //    return false;
                //}

                //auto it = partyChannels.find(party);
                //if (it == partyChannels.end()) {
                //    return false;
                //}

                //delete it->second;
                //partyChannels.erase(it);
                break;

            default:
                PrivateChatChannel channel;
                if (!PrivateChannels.TryGetValue(channelId, out channel))
                {
                    return(false);
                }

                channel.CloseChannel();
                return(PrivateChannels.Remove(channelId));
            }
            return(true);
        }
示例#2
0
        private static async Task OnSocketMessage(string json)
        {
            try
            {
                Logger.Log("Received Message: " + json);
                PayloadModel payload = JsonConvert.DeserializeObject <PayloadModel>(json, JsonSettings);

                if (payload.Sequence.HasValue)
                {
                    sequence = payload.Sequence.Value;
                }

                switch (payload.Op)
                {
                case 0:     // Event Dispatch
                    break;

                case 1:     // Heartbeat
                    await Send(JsonConvert.SerializeObject(new PayloadModel <int>
                    {
                        Op   = 1,
                        Data = sequence
                    }, JsonSettings));

                    Logger.Log("Heartbeat");
                    break;

                case 7:     // Reconnect
                    Logger.Log("Reconnect Requested");
                    await Resume();

                    break;

                case 9:     // Invalid Session
                    Logger.LogError("Received invalid session from discord.");
                    var resume = payload.As <bool>().Data;
                    if (resume)
                    {
                        await Resume();
                    }
                    else
                    {
                        Stop();
                    }
                    break;

                case 10:     // Hello
                    acked = true;
                    var heartbeat = payload.As <HeartbeatModel>().Data;
                    Heartbeat(heartbeat.HeartbeatInterval);
                    break;

                case 11:     // Heartbeat Ack
                    Logger.Log("Heatbeat Ack");
                    acked = true;
                    break;
                }

                if (!string.IsNullOrEmpty(payload.Event))
                {
                    switch (payload.Event.ToLower())
                    {
                    // ------ API ------

                    case "ready":
                    {
                        Logger.Log("Ready.");

                        var ready = payload.As <ReadyModel>().Data;

                        Sync(() =>
                            {
                                Version = ready.Version;
                                session = ready.SessionId;
                                User    = new DiscordUser(ready.User);

                                foreach (var channel in ready.PrivateChannels)
                                {
                                    PrivateChannels[channel.Id] = new DiscordChannel(channel);
                                }

                                foreach (var guild in ready.Guilds)
                                {
                                    Servers[guild.Id] = new DiscordServer(guild);
                                }

                                startTask.SetResult(true);
                                interfaces.OnDiscordAPIOpen();
                            });
                    }
                    break;

                    case "resumed":
                    {
                        Logger.Log("Resumed.");
                        Sync(() => interfaces.OnDiscordAPIResumed());
                    }
                    break;

                    case "reonnect":
                    {
                        Logger.Log("Reconnect.");
                        await Resume();
                    }
                    break;

                    //  ------ Channels ------

                    case "channel_create":
                    {
                        var channel = payload.As <ChannelModel>().Data;

                        Sync(() =>
                            {
                                if (!string.IsNullOrEmpty(channel.GuildId))
                                {
                                    Servers[channel.GuildId].Channels[channel.Id] = new DiscordChannel(channel);
                                    interfaces.OnChannelCreated(Servers[channel.GuildId].Channels[channel.Id]);
                                }

                                else
                                {
                                    PrivateChannels[channel.Id] = new DiscordChannel(channel);
                                    interfaces.OnChannelCreated(Servers[channel.GuildId].Channels[channel.Id]);
                                }
                            });
                    }
                    break;

                    case "channel_update":
                    {
                        var channel = payload.As <ChannelModel>().Data;

                        Sync(() =>
                            {
                                if (!string.IsNullOrEmpty(channel.GuildId))
                                {
                                    Servers[channel.GuildId].Channels[channel.Id] = new DiscordChannel(channel);
                                    interfaces.OnChannelUpdated(Servers[channel.GuildId].Channels[channel.Id]);
                                }

                                else
                                {
                                    PrivateChannels[channel.Id] = new DiscordChannel(channel);
                                    interfaces.OnChannelUpdated(Servers[channel.GuildId].Channels[channel.Id]);
                                }
                            });
                    }
                    break;

                    case "channel_delete":
                    {
                        var channel = payload.As <ChannelModel>().Data;

                        Sync(() =>
                            {
                                if (!string.IsNullOrEmpty(channel.GuildId))
                                {
                                    interfaces.OnChannelDeleted(Servers[channel.GuildId].Channels[channel.Id]);
                                    Servers[channel.GuildId].Channels.Remove(channel.Id);
                                }

                                else
                                {
                                    interfaces.OnChannelDeleted(Servers[channel.GuildId].Channels[channel.Id]);
                                    PrivateChannels.Remove(channel.Id);
                                }
                            });
                    }
                    break;

                    case "channel_pins_update":
                    {
                        var channelPin = payload.As <ChannelPinsModel>().Data;

                        Sync(() =>
                            {
                                if (!string.IsNullOrEmpty(channelPin.GuildId))
                                {
                                    Servers[channelPin.GuildId].Channels[channelPin.ChannelId].LastPinTimestamp = channelPin.LastPinTimestamp;
                                    interfaces.OnChannelPinsUpdated(Servers[channelPin.GuildId].Channels[channelPin.ChannelId], channelPin.LastPinTimestamp);
                                }

                                else
                                {
                                    PrivateChannels[channelPin.ChannelId].LastPinTimestamp = channelPin.LastPinTimestamp;
                                    interfaces.OnChannelPinsUpdated(Servers[channelPin.GuildId].Channels[channelPin.ChannelId], channelPin.LastPinTimestamp);
                                }
                            });
                    }
                    break;

                    //  ------ Servers ------

                    case "guild_create":
                    {
                        var guild = payload.As <GuildModel>().Data;

                        Sync(() =>
                            {
                                Servers[guild.Id] = new DiscordServer(guild);
                                interfaces.OnServerJoined(Servers[guild.Id]);
                            });
                    }
                    break;

                    case "guild_update":
                    {
                        var guild = payload.As <GuildModel>().Data;

                        Sync(() =>
                            {
                                Servers[guild.Id] = new DiscordServer(guild);
                                interfaces.OnServerUpdated(Servers[guild.Id]);
                            });
                    }
                    break;

                    case "guild_delete":
                    {
                        var guild = payload.As <GuildModel>().Data;

                        Sync(() =>
                            {
                                interfaces.OnServerLeft(Servers[guild.Id]);
                                Servers.Remove(guild.Id);
                            });
                    }
                    break;

                    case "guild_ban_add":
                    {
                        var guildBan = payload.As <GuildBanModel>().Data;

                        Sync(() =>
                            {
                                Servers[guildBan.GuildId].Bans[guildBan.User.Id] = new DiscordUser(guildBan.User);
                                interfaces.OnServerBan(Servers[guildBan.GuildId], Servers[guildBan.GuildId].Bans[guildBan.User.Id]);
                            });
                    }
                    break;

                    case "guild_ban_remove":
                    {
                        var guildBan = payload.As <GuildBanModel>().Data;

                        Sync(() =>
                            {
                                interfaces.OnServerUnban(Servers[guildBan.GuildId], Servers[guildBan.GuildId].Bans[guildBan.User.Id]);
                                Servers[guildBan.GuildId].Bans.Remove(guildBan.User.Id);
                            });
                    }
                    break;

                    case "guild_emojis_update":
                    {
                        var guildEmojis = payload.As <GuildEmojisModel>().Data;
                        Servers[guildEmojis.GuildId].Emojis = guildEmojis.Emojis.ToDictionary(x => x.Id, x => new DiscordEmoji(x));
                    }
                    break;

                    case "guild_member_add":
                    {
                        var guildMember = payload.As <GuildMemberModel>().Data;
                        Servers[guildMember.GuildId].Members[guildMember.User.Id] = new DiscordServerMember(guildMember);
                    }
                    break;

                    case "guild_member_remove":
                    {
                        var guildMember = payload.As <GuildMemberModel>().Data;
                        Servers[guildMember.GuildId].Members.Remove(guildMember.User.Id);
                    }
                    break;

                    case "guild_member_update":
                    {
                        var guildMember = payload.As <GuildMemberModel>().Data;
                        Servers[guildMember.GuildId].Members[guildMember.User.Id] = new DiscordServerMember(guildMember);
                    }
                    break;

                    case "guild_members_chunk":
                    {
                        var guildMembersChunk = payload.As <GuildMembersChunkModel>().Data;
                    }
                    break;

                    case "guild_role_create":
                    {
                        var guildRole = payload.As <GuildRoleModel>().Data;
                        Servers[guildRole.GuildId].Roles[guildRole.Role.Id] = new DiscordRole(guildRole.Role);
                    }
                    break;

                    case "guild_role_update":
                    {
                        var guildRole = payload.As <GuildRoleModel>().Data;
                        Servers[guildRole.GuildId].Roles[guildRole.Role.Id] = new DiscordRole(guildRole.Role);
                    }
                    break;

                    case "guild_role_delete":
                    {
                        var guildRoleId = payload.As <GuildRoleIdModel>().Data;
                        Servers[guildRoleId.GuildId].Roles.Remove(guildRoleId.RoleId);
                    }
                    break;

                    //  ------ Invites ------

                    case "invite_create":
                    {
                        var invite = payload.As <InviteModel>().Data;
                        Servers[invite.GuildId].Invites[invite.Code] = new DiscordInvite(invite);
                    }
                    break;

                    case "invite_delete":
                    {
                        var invite = payload.As <InviteModel>().Data;
                        Servers[invite.GuildId].Invites.Remove(invite.Code);
                    }
                    break;

                    //  ------ Messages ------

                    case "message_create":
                    {
                        var message = payload.As <MessageModel>().Data;

                        Sync(() =>
                            {
                                interfaces.OnMessageCreated(new DiscordMessage(message));
                            });
                    }
                    break;

                    case "message_update":
                    {
                        var message = payload.As <MessageModel>().Data;

                        Sync(() =>
                            {
                                interfaces.OnMessageUpdated(new DiscordMessage(message));
                            });
                    }
                    break;

                    case "message_delete":
                    {
                        var message = payload.As <MessageModel>().Data;

                        Sync(() =>
                            {
                                interfaces.OnMessageDeleted(new DiscordMessage(message));
                            });
                    }
                    break;

                    case "message_delete_bulk":
                    {
                        var messageBulk = payload.As <MessageBulkModel>().Data;
                    }
                    break;

                    case "message_reaction_add":
                    {
                        var messageReaction = payload.As <MessageReactionModel>().Data;
                    }
                    break;

                    case "message_reaction_remove":
                    {
                        var messageReaction = payload.As <MessageReactionModel>().Data;
                    }
                    break;

                    case "message_reaction_remove_all":
                    {
                        var messageReaction = payload.As <MessageReactionModel>().Data;
                    }
                    break;

                    case "message_reaction_remove_emoji":
                    {
                        var messageReaction = payload.As <MessageReactionModel>().Data;
                    }
                    break;

                    //  ------ Status ------

                    case "presence_update":
                    {
                        var presence = payload.As <PresenceModel>().Data;
                    }
                    break;

                    case "typing_start":
                    {
                        var typing = payload.As <TypingModel>().Data;
                    }
                    break;

                    case "user_update":
                    {
                        var user = payload.As <UserModel>().Data;
                    }
                    break;

                    //  ------ Voice ------

                    case "voice_state_update":
                    {
                        var voiceState = payload.As <VoiceStateModel>().Data;
                    }
                    break;

                    case "voice_server_update":
                    {
                        var voiceServer = payload.As <VoiceServerModel>().Data;
                    }
                    break;

                    //  ------ Webhooks ------

                    case "webhooks_update":
                    {
                        var webhook = payload.As <ServerWebhookModel>().Data;
                    }
                    break;
                    }
                }
            }

            catch (Exception exception)
            {
                Logger.LogError("Exception occured while processing message.", exception);
            }
        }