Пример #1
0
        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!");
                }
            }
        }
Пример #2
0
        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()}.");
        }
Пример #3
0
        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}`.");
            }
        }
Пример #4
0
        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!");
            }
        }
Пример #5
0
 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))));
 }
Пример #6
0
 public GameStatusUpdater(
     DiscordSocketClient discordSocketClient,
     SignupsData signupsData
     )
 {
     _signupsData         = signupsData;
     _discordSocketClient = discordSocketClient;
 }
Пример #7
0
 public SignupHelper(
     DiscordSocketClient client,
     Config config,
     MiscHelper miscHelper,
     SignupsData signupsData)
 {
     _client      = client;
     _config      = config;
     _miscHelper  = miscHelper;
     _signupsData = signupsData;
 }
Пример #8
0
 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;
 }
Пример #9
0
        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.");
            }
        }
Пример #10
0
        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}`.");
            }
        }
Пример #11
0
        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.");
            }
        }
Пример #12
0
        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.");
            }
        }
Пример #13
0
        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ć?");
            }
        }
Пример #14
0
 public BanHelper(SignupsData signupsData)
 {
     _signupsData = signupsData;
 }
Пример #15
0
        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);
        }
Пример #16
0
        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();
            }
        }
Пример #17
0
        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);
        }