// Thank you Yukine. Guys please go check out the bot named Senpai by Yukine#8080. An awesome bot by an awesome dev. private void BrokerOnReceive(object?_, AmqpReceiveEventArgs e) { Task.Run(async() => { var @event = e.Event; if (int.TryParse(@event, out var shardId)) { if (!_gatewayCluster.Shards.TryGetValue(shardId, out var shard)) { return; } var packet = JsonSerializer.Deserialize <SendPacket>(Encoding.UTF8.GetString(e.Data)); await shard.SendAsync(packet.OpCode, packet.Data); } else if (@event == "SEND") { var data = JsonSerializer.Deserialize <SendableDispatch>(Encoding.UTF8.GetString(e.Data)); var dataBytes = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(data.Packet)); if (data.GuildId == "*") { var tasks = new Task[ShardCount]; for (var i = 0; i < ShardCount; i++) { tasks[i] = _broker.PublishAsync(i.ToString(), dataBytes); } await Task.WhenAll(tasks); } else { var calculatedShardId = (long.Parse(data.GuildId) >> DiscordShardingFormula) % _gatewayCluster.Shards.Count; await _broker.PublishAsync(calculatedShardId.ToString(), dataBytes); } } _broker.Ack(e.Event, e.DeliveryTag); }).Wait(); }
public void HandleEvent(SkyraEvent @event, AmqpReceiveEventArgs args) { var data = Encoding.UTF8.GetString(args.Data); switch (@event) { case SkyraEvent.READY: OnReady(JsonConvert.DeserializeObject <ReadyDispatch>(data)); break; case SkyraEvent.RESUMED: break; case SkyraEvent.CHANNEL_CREATE: break; case SkyraEvent.CHANNEL_UPDATE: break; case SkyraEvent.CHANNEL_DELETE: break; case SkyraEvent.CHANNEL_PINS_UPDATE: break; case SkyraEvent.GUILD_CREATE: OnRawGuildCreate(JsonConvert.DeserializeObject <Guild>(data)); break; case SkyraEvent.GUILD_UPDATE: OnRawGuildUpdate(JsonConvert.DeserializeObject <Guild>(data)); break; case SkyraEvent.GUILD_DELETE: OnRawGuildDelete(JsonConvert.DeserializeObject <UnavailableGuild>(data)); break; case SkyraEvent.GUILD_BAN_ADD: OnRawGuildBanAdd(JsonConvert.DeserializeObject <GuildBanAddPayload>(data)); break; case SkyraEvent.GUILD_BAN_REMOVE: OnRawGuildBanRemove(JsonConvert.DeserializeObject <GuildBanRemovePayload>(data)); break; case SkyraEvent.GUILD_EMOJIS_UPDATE: break; case SkyraEvent.GUILD_INTEGRATIONS_UPDATE: break; case SkyraEvent.GUILD_MEMBER_ADD: break; case SkyraEvent.GUILD_MEMBER_REMOVE: break; case SkyraEvent.GUILD_MEMBER_UPDATE: break; case SkyraEvent.GUILD_MEMBERS_CHUNK: break; case SkyraEvent.GUILD_ROLE_CREATE: break; case SkyraEvent.GUILD_ROLE_UPDATE: break; case SkyraEvent.GUILD_ROLE_DELETE: break; case SkyraEvent.INVITE_CREATE: break; case SkyraEvent.INVITE_DELETE: break; case SkyraEvent.MESSAGE_CREATE: OnRawMessageCreateAsync(JsonConvert.DeserializeObject <Message>(data)); break; case SkyraEvent.MESSAGE_UPDATE: OnRawMessageUpdateAsync(JsonConvert.DeserializeObject <MessageUpdatePayload>(data)); break; case SkyraEvent.MESSAGE_DELETE: OnRawMessageDeleteAsync(JsonConvert.DeserializeObject <MessageDeletePayload>(data)); break; case SkyraEvent.MESSAGE_DELETE_BULK: break; case SkyraEvent.MESSAGE_REACTION_ADD: break; case SkyraEvent.MESSAGE_REACTION_REMOVE: break; case SkyraEvent.MESSAGE_REACTION_REMOVE_ALL: break; case SkyraEvent.MESSAGE_REACTION_REMOVE_EMOJI: break; case SkyraEvent.PRESENCE_UPDATE: break; case SkyraEvent.PRESENCES_REPLACE: break; case SkyraEvent.TYPING_START: break; case SkyraEvent.USER_UPDATE: break; case SkyraEvent.VOICE_STATE_UPDATE: break; case SkyraEvent.VOICE_SERVER_UPDATE: break; case SkyraEvent.WEBHOOKS_UPDATE: break; case SkyraEvent.NOTIFY_TWITCH_STREAM_START: break; case SkyraEvent.NOTIFY_TWITCH_STREAM_END: break; default: throw new ArgumentOutOfRangeException(nameof(@event), @event.ToString(), null); } }