private async void SendRemindMessageAsync(Reminder reminder) { var users = reminder.Users.Select(id => ParentShard.GetUser(reminder.Server, id)); var channel = ParentShard.GetTextChannel(reminder.Server, reminder.Channel); //Can't send the message if the channel has been deleted if (channel == null) { return; } var stringBuilder = new StringBuilder(); foreach (var user in users) { stringBuilder.Append(user.Mention).Append(" "); } var builder = new EmbedBuilder(); builder.WithDescription($"Reminder for [Message]({reminder.Link})"); await channel.SendMessageAsync(stringBuilder.ToString(), embed : builder.Build()); }
public override async Task Stop() { try { await ParentShard.ListenForEvent <JObject>( (int)Shard.MessageType.Dispatch, "VOICE_STATE_UPDATE", listenerCreateCallback : async() => { await ParentShard.Send((int)Shard.MessageType.VoiceStateUpdate, new JObject { { "guild_id", _serverId }, { "channel_id", null }, { "self_mute", false }, { "self_deaf", false }, }); }, validator : data => { return(data["guild_id"].ToObject <string>() == _serverId); }); } finally { // Discord should close the socket after the voice state update. await Task.WhenAny( Task.Run(() => { while (Socket.State != WebSocket4Net.WebSocketState.Closed) { Thread.Sleep(200); } }), Task.Delay(TimeSpan.FromSeconds(10))); if (Socket.State != WebSocket4Net.WebSocketState.Closed) { Logger.Warn($"[{Name}] Expected Discord to close the socket, but it did not."); } await base.Stop(); } }