public async Task StartSignups([Remainder] string title) { var signups = _map.GetService <SignupsData>(); if (SignupsData.GetCurrentlyEditedMission(Context.User.Id) != null) { await ReplyAsync("O ty luju, najpierw dokończ definiowanie poprzednich zapisów!"); } else { if (_client.GetGuild(_config.AFGuild).GetUser(Context.User.Id).Roles.Any(x => x.Id == _config.MissionMakerRole)) { var mission = new Mission(); mission.Title = title; mission.Owner = Context.User.Id; mission.Date = DateTime.Now; mission.Editing = Mission.EditEnum.New; SignupsData.Missions.Add(mission); await ReplyAsync("Zdefiniuj reszte misji."); } else { await ReplyAsync("Luju ty, nie jestes uprawniony do tworzenia misji!"); } } }
public async Task Date([Remainder] DateTime date) { if (date.IsInPast()) { await ReplyAsync(":warning: Podana data jest w przeszłości!"); } else if (date.IsNoLaterThanDays(1)) { await ReplyAsync(":warning: Podana data jest za mniej niż 24 godziny!"); } var mission = SignupsData.GetCurrentlyEditedMission(Context.User.Id); if (mission is null) { await ReplyAsync(":warning: Nie tworzysz ani nie edytujesz teraz żadnej misji."); return; } mission.Date = date; if (!mission.CustomClose) { mission.CloseTime = date.AddMinutes(-60); } await ReplyAsync($"Data misji ustawiona na {date}, za {date.FromNow()}."); }
public async Task EditMission(IGuildChannel channel) { var currentlyEditedMission = SignupsData.GetCurrentlyEditedMission(Context.User.Id); if (currentlyEditedMission == null) { var missionToBeEdited = SignupsData.Missions.FirstOrDefault(x => x.SignupChannel == channel.Id); if (missionToBeEdited == null) { await ReplyAsync("Nie ma misji o takiej nazwie."); return; } if (missionToBeEdited.Owner != Context.User.Id) { await ReplyAsync("Nie nauczyli żeby nie ruszać nie swojego?"); return; } var serialized = JsonConvert.SerializeObject(missionToBeEdited); SignupsData.BeforeEditMissions[Context.User.Id] = JsonConvert.DeserializeObject <ArmaforcesMissionBotSharedClasses.Mission>(serialized); missionToBeEdited.Editing = ArmaforcesMissionBotSharedClasses.Mission.EditEnum.Started; await ReplyAsync($"A więc `{missionToBeEdited.Title}`. Co chcesz zmienić?"); } else { await ReplyAsync($"Hola hola, nie wszystko naraz. Skończ edytować `{currentlyEditedMission.Title}`."); } }
public async Task Close([Remainder] DateTime closeDate) { if (closeDate.IsInPast()) { await ReplyAsync(":warning: Podana data jest w przeszłości!"); } else if (closeDate.IsNoLaterThanDays(1)) { await ReplyAsync(":warning: Podana data jest za mniej niż 24 godziny!"); } var mission = SignupsData.GetCurrentlyEditedMission(Context.User.Id); if (mission is null) { await ReplyAsync(":warning: Nie tworzysz ani nie edytujesz teraz żadnej misji."); return; } if (closeDate < mission.Date) { mission.CloseTime = closeDate; mission.CustomClose = true; await ReplyAsync($"Data zamknięcia zapisów ustawiona na {closeDate}, za {closeDate.FromNow()}!"); } else { await ReplyAsync(":warning: Zamknięcie zapisów musi być przed datą misji!"); } }
public static Mission GetCurrentlyEditedMission(this SignupsData signupsData, ulong userId) { return(signupsData.Missions.SingleOrDefault(x => x.Owner == userId && ((x.Editing == ArmaforcesMissionBotSharedClasses.Mission.EditEnum.New) || (x.Editing == ArmaforcesMissionBotSharedClasses.Mission.EditEnum.Started)))); }
public GameStatusUpdater( DiscordSocketClient discordSocketClient, SignupsData signupsData ) { _signupsData = signupsData; _discordSocketClient = discordSocketClient; }
public SignupHelper( DiscordSocketClient client, Config config, MiscHelper miscHelper, SignupsData signupsData) { _client = client; _config = config; _miscHelper = miscHelper; _signupsData = signupsData; }
public ApiController( MissionsArchiveData missionsArchiveData, SignupsData signupsData, DiscordSocketClient client, BanHelper banHelper, SignupHelper signupHelper, MiscHelper miscHelper) { _missionsArchiveData = missionsArchiveData; _signupsData = signupsData; _client = client; _banHelper = banHelper; _signupHelper = signupHelper; _miscHelper = miscHelper; }
public async Task Description([Remainder] string description) { var mission = SignupsData.GetCurrentlyEditedMission(Context.User.Id); if (mission != null) { mission.Description = description; if (Context.Message.Attachments.Count > 0) { mission.Attachment = Context.Message.Attachments.ElementAt(0).Url; } await ReplyAsync("Teraz podaj nazwe modlisty."); } else { await ReplyAsync("Najpierw zdefiniuj nazwę misji cymbale."); } }
public async Task EditMission(int missionNo) { var currentlyEditedMission = SignupsData.GetCurrentlyEditedMission(Context.User.Id); if (currentlyEditedMission == null) { var userMissions = SignupsData.Missions.Where(x => x.Owner == Context.User.Id); var missionToBeEdited = userMissions.ElementAt(missionNo); // Don't want to write another function just to copy class, and performance isn't a problem here so just serialize it and deserialize var serialized = JsonConvert.SerializeObject(missionToBeEdited); SignupsData.BeforeEditMissions[Context.User.Id] = JsonConvert.DeserializeObject <ArmaforcesMissionBotSharedClasses.Mission>(serialized); missionToBeEdited.Editing = ArmaforcesMissionBotSharedClasses.Mission.EditEnum.Started; await ReplyAsync($"A więc `{missionToBeEdited.Title}`. Co chcesz zmienić?"); } else { await ReplyAsync($"Hola hola, nie wszystko naraz. Skończ edytować `{currentlyEditedMission.Title}`."); } }
public async Task ToggleMentionEveryone() { var mission = SignupsData.GetCurrentlyEditedMission(Context.User.Id); if (mission is null) { await ReplyAsync(":warning: Nie tworzysz ani nie edytujesz teraz żadnej misji."); return; } mission.MentionEveryone = !mission.MentionEveryone; if (mission.MentionEveryone) { await ReplyAsync("Wołanie wszystkich zostało włączone."); } else { await ReplyAsync("Wołanie wszystkich zostało wyłączone."); } }
public async Task Modlist([Remainder] string modsetNameOrUrl) { var mission = SignupsData.GetCurrentlyEditedMission(Context.User.Id); if (mission != null) { var modsetName = ModsetProvider.GetModsetNameFromUrl(modsetNameOrUrl); await ModsetProvider.GetModsetDownloadUrl(modsetName).Match( onSuccess: url => { mission.ModlistUrl = mission.Modlist = url.Replace(" ", "%20"); mission.ModlistName = modsetName; return(ReplyAsync($"Modset {modsetName} was found under {mission.ModlistUrl}.")); }, onFailure: error => ReplyAsync(error)); } else { await ReplyAsync("Najpierw zdefiniuj nazwę misji cymbale."); } }
public async Task CreateSignupChannel(SignupsData signups, ulong ownerID, ISocketMessageChannel channnel) { if (signups.Missions.Any(x => x.Editing == Mission.EditEnum.New && x.Owner == ownerID)) { var mission = signups.Missions.Single(x => x.Editing == Mission.EditEnum.New && x.Owner == ownerID); await mission.Access.WaitAsync(-1); try { if (CheckMissionComplete(mission)) { var guild = _client.GetGuild(_config.AFGuild); var signupChannel = await CreateChannelForMission(guild, mission, signups); mission.SignupChannel = signupChannel.Id; await CreateMissionMessagesOnChannel(guild, mission, signupChannel); mission.Editing = Mission.EditEnum.NotEditing; } else { await channnel.SendMessageAsync("Nie uzupełniłeś wszystkich informacji ciołku!"); } } catch (Exception e) { await channnel.SendMessageAsync($"Oj, coś poszło nie tak: {e.Message}"); } finally { mission.Access.Release(); } } else { await channnel.SendMessageAsync("A może byś mi najpierw powiedział co ty chcesz potwierdzić?"); } }
public BanHelper(SignupsData signupsData) { _signupsData = signupsData; }
public async Task <SocketTextChannel> UpdateMission(SocketGuild guild, Mission mission, SignupsData signups) { // Sort channels by date signups.Missions.Sort((x, y) => { return(x.Date.CompareTo(y.Date)); }); var signupChannel = guild.GetChannel(mission.SignupChannel) as SocketTextChannel; await signupChannel.ModifyAsync(x => { x.CategoryId = _config.SignupsCategory; // Kurwa dlaczego to nie działa var index = (int)(mission.Date - new DateTime(2019, 1, 1)).TotalMinutes; // really hacky solution to avoid recalculating indexes for each channel integer should have // space for around 68 years, and this bot is not going to work this long for sure x.Position = index; x.Name = mission.Title; }); var mainEmbed = await CreateMainEmbed(guild, mission); var messages = signupChannel.GetMessagesAsync(1000); await messages.ForEachAsync(x => { foreach (var missionMsg in x) { if (missionMsg.Embeds.Count != 0 && missionMsg.Author.Id == _client.CurrentUser.Id) { var embed = missionMsg.Embeds.Single(); if (embed.Author != null) { (missionMsg as IUserMessage).ModifyAsync(message => message.Embed = mainEmbed.Build()); } } } }); return(signupChannel); }
private async Task HandleReactionChange(Cacheable <IUserMessage, ulong> message, ISocketMessageChannel channel, SocketReaction reaction, SignupsData signups) { await signups.BanAccess.WaitAsync(-1); try { if (!signups.ReactionTimes.ContainsKey(reaction.User.Value.Id)) { signups.ReactionTimes[reaction.User.Value.Id] = new Queue <DateTime>(); } signups.ReactionTimes[reaction.User.Value.Id].Enqueue(DateTime.Now); Console.WriteLine($"[{ DateTime.Now.ToString()}] { reaction.User.Value.Username} spam counter: { signups.ReactionTimes[reaction.User.Value.Id].Count}"); if (signups.ReactionTimes[reaction.User.Value.Id].Count >= 10 && !signups.SpamBans.ContainsKey(reaction.User.Value.Id)) { await Helpers.BanHelper.BanUserSpam(_services, reaction.User.Value); } } finally { signups.BanAccess.Release(); } }
public async Task <RestTextChannel> CreateChannelForMission(SocketGuild guild, Mission mission, SignupsData signups) { // Sort channels by date signups.Missions.Sort((x, y) => { return(x.Date.CompareTo(y.Date)); }); var signupChannel = await guild.CreateTextChannelAsync(mission.Title, x => { x.CategoryId = _config.SignupsCategory; // Kurwa dlaczego to nie działa var index = (int)(mission.Date - new DateTime(2019, 1, 1)).TotalMinutes; // really hacky solution to avoid recalculating indexes for each channel integer should have // space for around 68 years, and this bot is not going to work this long for sure x.Position = index; }); var everyone = guild.EveryoneRole; var armaforces = guild.GetRole(_config.SignupRole); var botRole = guild.GetRole(_config.BotRole); var banPermissions = new OverwritePermissions( PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny); var botPermissions = new OverwritePermissions( PermValue.Deny, PermValue.Allow, PermValue.Allow, PermValue.Allow, PermValue.Allow, PermValue.Deny, PermValue.Allow, PermValue.Allow, PermValue.Allow, PermValue.Allow, PermValue.Allow, PermValue.Allow, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Allow, PermValue.Deny); var everyoneStartPermissions = new OverwritePermissions( PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny, PermValue.Deny); try { await signupChannel.AddPermissionOverwriteAsync(botRole, botPermissions); await signups.BanAccess.WaitAsync(-1); try { foreach (var ban in signups.SpamBans) { await signupChannel.AddPermissionOverwriteAsync(_client.GetGuild(_config.AFGuild).GetUser(ban.Key), banPermissions); } } catch (Exception e) { Console.WriteLine(e.Message); } finally { signups.BanAccess.Release(); } await signupChannel.AddPermissionOverwriteAsync(everyone, everyoneStartPermissions); } catch (Exception e) { Console.WriteLine(e.Message); } return(signupChannel); }