/// <summary> /// Gets or creates welcome message and refreshes reaction emojis /// </summary> /// <returns></returns> public async Task WelcomeMessageInit() { var existingWelcomeMessage = DateTextChannel.GetMessageAsync(WelcomeMessageId); //TODO Would be nice to have an override for one action with many emojis, passing emoji in for simplicity var answers = new Answer[2 + OptionEmojis.Count()]; answers[0] = new Answer(MaleEmoji, e => { //TODO doesn't add those that are not yet in activity UserState uState = AddOrGetUserState(e.User); uState.Gender = GenderEnum.Male; uState.AgeOptions = 0; }); answers[1] = new Answer(FemaleEmoji, e => { UserState uState = AddOrGetUserState(e.User); uState.Gender = GenderEnum.Female; uState.AgeOptions = 0; }); for (int i = 2; i < answers.Length; i++) { var index = i; answers[index] = new Answer(OptionEmojis[index - 2], e => { UserState uState = AddOrGetUserState(e.User); var option = 1 << (index - 2); if (uState.Gender == GenderEnum.Female) { uState.AgeOptions ^= option; //toggle age group } else { uState.AgeOptions = option; } }); } Task.WaitAny(new Task[] { existingWelcomeMessage, Task.Delay(5000) }); WelcomeMessage = await DialogFramework.CreateQuestion(DateTextChannel, WelcomeMessageBody, answers, existingMessage : !existingWelcomeMessage.IsFaulted?existingWelcomeMessage.Result : null, behavior : MessageBehavior.Permanent, deleteAnswer : true, deleteAnswerTimeout : TimeSpan.Zero); WelcomeMessageId = WelcomeMessage.Id; }
/// <summary> /// Gets all channels, members in them and set's up event handlers /// </summary> /// <param name="guild"></param> /// <returns></returns> internal async Task Initialize(DiscordGuild guild) { //DebugLogWriteLine($"Initiating {guild} GuildTask... "); //Init guild Guild = guild; GuildId = guild.Id; SecretRoomOverwriteBuilder = new DiscordOverwriteBuilder(); SecretRoomOverwriteBuilder.For(Guild.EveryoneRole); SecretRoomOverwriteBuilder.Deny(Permissions.AccessChannels); //PersonalChannelOverwriteBuilder = new DiscordOverwriteBuilder(); //PersonalChannelOverwriteBuilder.Allow(Permissions.AccessChannels); LogChannel = guild.GetChannel(LogChannelId); if (LogChannel != null) { LogMessage = await LogChannel.SendMessageAsync($"Begin of log {DateTime.Now.ToString()}\n"); } //Init RootCategory Guild.Channels.TryGetValue(DateCategoryId, out DiscordChannel cat); if (cat == null) { string m = $"Initialize failed. No Category found on + {DateCategoryId}"; //DebugLogWriteLine(m); throw new Exception(m); } DateRootCategory = cat; Guild.Channels.TryGetValue(DateSecretCategoryId, out DiscordChannel secCat); DateSecretCategory = secCat; //DebugLogWrite("Initiating voice channels... "); //VoiceChannels DateVoiceLobbies.Clear(); SecretRooms.Clear(); DateVoiceLobbies.AddRange(GetVoiceLobbies()); SecretRooms.AddRange(GetSecretRooms()); await VoiceChannelsInitAsync().ConfigureAwait(false); if (DateVoiceLobbies.Count == 0 || DateVoiceLobbies.All(c => c.Users.Count() > 0)) { await AddLastEmptyVoiceLobby().ConfigureAwait(false); } //DebugLogWrite("Initiating Emojis... "); //GetEmojis MaleEmoji = DiscordEmoji.FromUnicode(DateBot.Instance.Client, MaleEmojiId); FemaleEmoji = DiscordEmoji.FromUnicode(DateBot.Instance.Client, FemaleEmojiId); OptionEmojis.Clear(); OptionEmojis.AddRange(OptionEmojiIds.Select(id => DiscordEmoji.FromUnicode(DateBot.Instance.Client, id))); LikeEmoji = DiscordEmoji.FromUnicode(DateBot.Instance.Client, LikeEmojiId); DisLikeEmoji = DiscordEmoji.FromUnicode(DateBot.Instance.Client, DisLikeEmojiId); TimeEmoji = DiscordEmoji.FromUnicode(DateBot.Instance.Client, TimeEmojiId); CancelLikeEmoji = DiscordEmoji.FromUnicode(DateBot.Instance.Client, CancelLikeEmojiId); //DebugLogWrite("Initiating Users in lobbies... "); //Check and add users in lobbies foreach (var u in UsersInLobbies.ToArray()) { AddOrGetUserState(u).LastEnteredLobbyTime = DateTime.Now; } //DebugLogWrite("Initiating Welcome message... "); //Check for welcome message TODO add option emojis DateTextChannel = Guild.GetChannel(DateTextChannelId); await WelcomeMessageInit().ConfigureAwait(false); _ = PrivateControlsMessageInit().ConfigureAwait(false); //UpdateTimer = new Timer(TimeSpan.FromSeconds(30).TotalMilliseconds) { AutoReset = true }; //UpdateTimer.Elapsed += UpdateTimer_Elapsed; //UpdateTimer.Start(); //DebugLogWrite("finished"); InitTask = null; Initialized = true; if (UsersInLobbies.Count > 0) { TryStartMatchingTask(); } }