private async Task <IResult> SetTime(long chatId, string time, ConsumerType consumerType)
    {
        var splittedTime = time.Split(':');

        if (splittedTime.Length != 2)
        {
            return(new FailedResult("Укажите время в формате часы:минуты (например, 11:30)"));
        }

        try
        {
            var cronTime = new CronTime(splittedTime[1], splittedTime[0]);
            var job      = await _context.CronJobs.FirstOrDefaultAsync(x => x.ChatId == chatId);

            if (job is null)
            {
                await _context.CronJobs.AddAsync(new CronJob(chatId.ToString(), chatId, 0, string.Empty,
                                                             cronTime, consumerType, CronType.Schedule));
            }
            else
            {
                job.SetCronTime(cronTime);
            }

            await _context.SaveChangesAsync();

            return(new SuccessfulResult($"Время успешно установлено на {time}"));
        }
        catch (Exception e)
        {
            return(new FailedResult(e.Message));
        }
    }
        public async Task <AwardMessage> CreateAwardMessage(
            ulong originalMessageId,
            ulong originalChannelId,
            ulong awardedMessageId,
            ulong awardChannelId,
            ulong userId,
            uint awardCount)
        {
            var awardMessage = new AwardMessage
            {
                OriginalMessageId = originalMessageId,
                OriginalChannelId = originalChannelId,
                UserId            = userId,
                AwardedMessageId  = awardedMessageId,
                AwardChannelId    = awardChannelId,
                AwardCount        = awardCount,
                DateTime          = DateTime.UtcNow
            };

            await _dbContext.AddAsync(awardMessage);

            await _dbContext.SaveChangesAsync();

            return(awardMessage);
        }
示例#3
0
        public async Task <ulong> ClaimDailyScoreAsync(ulong userID)
        {
            DateTime now = DateTime.UtcNow;

            await using (var transaction = await dbContext.Database.BeginTransactionAsync())
            {
                var user = await FindOrCreateUser(userID);

                // FIXME: Can combine the two cases to be more similar, i.e. handle no streak and never claimed equally
                // FIXME: Make base score multiplier configurable
                const ulong BASE_SCORE_MULTIPLIER = 100;

                if (user.LastDailyClaimed == null)
                {
                    // First time claim
                    user.LastDailyClaimed   = now;
                    user.Score              = BASE_SCORE_MULTIPLIER;
                    user.CurrentDailyStreak = 1;
                }
                else
                {
                    // Check whether last claim was yesterday or earlier
                    if (now.Date == user.LastDailyClaimed?.Date)
                    {
                        throw new ScoreAlreadyClaimedException();
                    }

                    // Calculate additional points based on streak
                    if (now.Date.Subtract(user.LastDailyClaimed.Value.Date).TotalDays <= 1)
                    {
                        // Streak going
                        ++user.CurrentDailyStreak;
                    }
                    else
                    {
                        // Streak reset
                        user.CurrentDailyStreak = 1;
                    }

                    // Update score based on streak
                    user.Score           += (ulong)Math.Floor(1 + Math.Log2(user.CurrentDailyStreak)) * BASE_SCORE_MULTIPLIER;
                    user.LastDailyClaimed = now;
                }

                // Optimistic concurrency: If score was updated in the meantime (i.e. already claimed) transaction fails
                await dbContext.SaveChangesAsync();

                await transaction.CommitAsync();

                return(user.CurrentDailyStreak);
            }
        }
        public async Task <string> GenerateInitializeCommandContext(ulong serverId, ulong channelId)
        {
            if (_context.Leaderboards.Any(x => x.ServerId == serverId.ToString()))
            {
                return("Seems like a leaderboard is already setup on this server");
            }

            var leaderboard = new Leaderboard {
                ServerId = serverId.ToString(), ChannelId = channelId.ToString()
            };

            _context.Leaderboards.Add(leaderboard);
            await _context.SaveChangesAsync();

            return("Initialized leaderboard for this server. Users can join by using the `join` command.");
        }
示例#5
0
        public static async Task SetDefaultValueDbContextAsync()
        {
            using BotDbContext db = CreateMemoryDbContext();

            db.TelegramUsers.Add(new TelegramUser {
                Id = 123456789, UserName = "******"
            });
            db.TelegramUsers.Add(new TelegramUser {
                Id = 987654321, UserName = "******"
            });
            Guid clientId1 = Guid.NewGuid();
            Guid clientId2 = Guid.NewGuid();
            Guid clientId3 = Guid.NewGuid();

            db.AzureApps.Add(new AzureApp {
                Id = clientId1, Email = "*****@*****.**", Secrets = string.Empty, TelegramUserId = 123456789, Name = "App1"
            });
            db.AzureApps.Add(new AzureApp {
                Id = clientId2, Email = "*****@*****.**", Secrets = string.Empty, TelegramUserId = 123456789, Name = "App2"
            });
            db.AzureApps.Add(new AzureApp {
                Id = clientId3, Email = "*****@*****.**", Secrets = string.Empty, TelegramUserId = 987654321, Name = "App3"
            });
            db.AppAuths.Add(new AppAuth {
                Name = "Auth1", RefreshToken = string.Empty, Scope = DefaultGraphApi.Scope, AzureAppId = clientId1
            });
            db.AppAuths.Add(new AppAuth {
                Name = "Auth3", RefreshToken = string.Empty, Scope = "", AzureAppId = clientId3
            });

            await db.SaveChangesAsync();

            await db.DisposeAsync();
        }
示例#6
0
        public static async Task SetApiResultDbContextAsync()
        {
            using BotDbContext db = CreateMemoryDbContext();

            db.TelegramUsers.Add(new TelegramUser {
                Id = 123456789, UserName = "******"
            });
            db.TelegramUsers.Add(new TelegramUser {
                Id = 987654321, UserName = "******"
            });

            db.ApiResults.Add(new ApiResult {
                Result = "123", TelegramUserId = 123456789
            });
            db.ApiResults.Add(new ApiResult {
                Result = "123987456", TelegramUserId = 123456789
            });
            db.ApiResults.Add(new ApiResult {
                Result = "987654321", TelegramUserId = 987654321
            });

            await db.SaveChangesAsync();

            await db.DisposeAsync();
        }
示例#7
0
        public async Task Invoke(SocketUserMessage msg)
        {
            var blacklisted = new List <string>();

            if (msg.MentionedChannels.Count > 0)
            {
                foreach (var channel in msg.MentionedChannels)
                {
                    if (!await _context.BlacklistedChannels.AnyAsync(x =>
                                                                     x.GuildId == channel.Guild.Id && x.ChannelId == channel.Id))
                    {
                        var blacklistedChannel = new BlacklistedChannel
                        {
                            GuildId   = channel.Guild.Id,
                            ChannelId = channel.Id
                        };
                        await _context.BlacklistedChannels.AddAsync(blacklistedChannel);

                        blacklisted.Add(channel.Name);
                    }
                }

                await _context.SaveChangesAsync();

                var successResponse =
                    $"Added channels: {string.Join(", ", blacklisted)} to blacklist";
                await msg.Channel.SendMessageAsync(successResponse);
            }
            else
            {
                await msg.Channel.SendMessageAsync("Please mention one or more channels");
            }
        }
示例#8
0
    private async Task <IResult> SetScheduleMailing(BotUser user, bool isSchedule)
    {
        if (user.NarfuGroup == 0)
        {
            return(new FailedResult(DefaultErrors.GroupNotSet));
        }

        user.SetHasSchedule(!isSchedule);
        await _db.SaveChangesAsync();

        return(new SuccessfulResult
        {
            Message = Success,
            Keyboard = DefaultKeyboards.GetMailingKeyboard(user)
        });
    }
示例#9
0
    private async Task SendRemindsFromArray(Remind[] reminds)
    {
        if (!reminds.Any())
        {
            return;
        }

        foreach (var remind in reminds)
        {
            var message = $"Напоминаю:\n{remind.Text}";
            var sender  = _senders.FirstOrDefault(x => x.ConsumerType == remind.ConsumerType);
            if (sender is null)
            {
                throw new ArgumentNullException($"sender for '{remind.ConsumerType}' not found", nameof(sender));
            }

            await sender.Send(remind.ChatId, message);

            _db.Reminds.Remove(remind);
        }

        if (_db.ChangeTracker.HasChanges())
        {
            await _db.SaveChangesAsync();
        }
    }
示例#10
0
        private async Task OnDisconnectCommand(Provider.MessageEventArgs e, string command, string args)
        {
            var conversation = e.Message.OriginConversation;

            if (string.IsNullOrEmpty(args))
            {
                await conversation.SendMessage(
                    $"{BotPrefix}Использование:\n/disconnect <connectionId>\n\nГде <connectionId> - ID сопряжения. Узнать его можно, введя /list");

                return;
            }

            try
            {
                var connectionId = long.Parse(args);
                var connection   = _db.Connections
                                   .Include(c => c.LeftConversation)
                                   .Include(c => c.RightConversation)
                                   .SingleOrDefault(c => c.ConnectionId == connectionId);
                if (connection == null)
                {
                    throw new ArgumentException("Connection does not exists");
                }

                if (!connection.LeftConversation.Equals(conversation) &&
                    !connection.RightConversation.Equals(conversation))
                {
                    throw new ArgumentException("Connection does not valid for this chat");
                }
                var otherConversation = connection.LeftConversation.Equals(conversation)
                    ? connection.RightConversation
                    : connection.LeftConversation;

                _db.Connections.Remove(connection);
                await _db.SaveChangesAsync();

                await Task.WhenAll(
                    conversation.SendMessage($"{BotPrefix}Чат {otherConversation} отключён"),
                    otherConversation.SendMessage($"{BotPrefix} Чат {conversation} отключён")
                    );
            }
            catch (Exception ex) when(ex is ArgumentException || ex is FormatException)
            {
                await conversation.SendMessage($"{BotPrefix}Сопряжение с таким ID не найдено");
            }
        }
示例#11
0
        public async Task CreateWithCredentials(LeaderboardParticipant participant, StravaOauthResponse oauthResponse)
        {
            _dbContext.Participants.Add(participant);

            var credentials = _dbContext.Credentials.FirstOrDefault(x => x.StravaId == participant.StravaId);

            if (credentials == null)
            {
                _dbContext.Credentials.Add(new StravaCredential(participant.StravaId, oauthResponse.AccessToken, oauthResponse.RefreshToken));
            }
            else
            {
                credentials.UpdateWithNewTokens(oauthResponse);
                _dbContext.Credentials.Update(credentials);
            }
            await _dbContext.SaveChangesAsync();
        }
        private async Task SaveMessage(Message message, ServicesContext serviceContext, BotDbContext dbContext)
        {
            var messageParts = message.Text.Split(' ');
            var client       = serviceContext.TelegramBotService.Client;

            if (messageParts.Length >= 2)
            {
                var originMessage = message.ReplyToMessage;
                if (originMessage == null)
                {
                    await client.SendTextMessageAsync
                    (
                        message.Chat.Id,
                        "Reply to a message >.> baka.",
                        replyToMessageId : message.MessageId
                    );
                }
                else
                {
                    var table         = dbContext.AdminSavedMessages;
                    var existingEntry = table.Where(savedMessage => savedMessage.ChatId == message.Chat.Id && savedMessage.MessageTag == messageParts[1]).FirstOrDefault();
                    if (existingEntry != null)
                    {
                        await client.SendTextMessageAsync
                        (
                            message.Chat.Id,
                            "Updated message ^-^",
                            replyToMessageId : message.MessageId
                        );

                        existingEntry.ChatId    = message.Chat.Id;
                        existingEntry.MessageId = originMessage.MessageId;
                    }
                    else
                    {
                        await client.SendTextMessageAsync
                        (
                            message.Chat.Id,
                            "Saved message ^-^",
                            replyToMessageId : message.MessageId
                        );

                        table.Add(new AdminSavedMessages(messageParts[1], message.Chat.Id, originMessage.MessageId));
                    }
                    await dbContext.SaveChangesAsync();
                }
            }
            else
            {
                await client.SendTextMessageAsync
                (
                    message.Chat.Id,
                    "Invalid request >_<",
                    replyToMessageId : message.MessageId
                );
            }
        }
示例#13
0
        /// <inheritdoc />
        public async Task <bool> InsertRecordAsync(BotDataModel botDataModel)
        {
            // Add new record to the database
            await _botDbContext.BotData.AddAsync(botDataModel);

            // Save changes
            return(await _botDbContext.SaveChangesAsync() > 0);
        }
示例#14
0
    private async Task RemoveJob(long chatId)
    {
        var job = _context.CronJobs.FirstOrDefaultAsync(x => x.ConsumerType == ConsumerType.Vkontakte &&
                                                        x.ChatId == chatId);

        if (job != null)
        {
            _context.Remove(job);
            await _context.SaveChangesAsync();
        }
    }
示例#15
0
    public async Task <IResult> Execute(Message msg, BotUser user)
    {
        user = _db.Entry(user).Entity;
        user.SetErrorNotification(!user.IsErrorsEnabled);
        await _db.SaveChangesAsync();

        return(new SuccessfulResult
        {
            Message = user.IsErrorsEnabled ? "Ошибки включены" : "Ошибки отключены"
        });
    }
示例#16
0
        public async Task AddAdmin(SocketRole role)
        {
            var adminRole = new AdminRole
            {
                GuildId  = role.Guild.Id,
                RoleId   = role.Id,
                RoleName = role.Name
            };
            await _context.AdminRoles.AddAsync(adminRole);

            await _context.SaveChangesAsync();
        }
示例#17
0
        public override async Task Execute(Update update, TelegramBotClient client)
        {
            var userId    = GetUserId(update);
            var chatId    = GetChatId(update);
            var messageId = GetMessageId(update);

            if (StateMachine.GetCurrentStep(userId) == 0)
            {
                var revenueButton = Bot.MakeInlineButton($"{new Emoji(0x1F4C8)} В доходи", "revenue");
                var expenseButton = Bot.MakeInlineButton($"{new Emoji(0x1F4C9)} До витрат", "expense");

                await client.SendTextMessageAsync(chatId, "Куди саме додати категорію?", replyMarkup : Bot.MakeInlineKeyboard(revenueButton, expenseButton));

                StateMachine.NextStep(userId);
                return;
            }
            if (StateMachine.GetCurrentStep(userId) == 1)
            {
                if (update.CallbackQuery.Data == "revenue")
                {
                    AddCategory(userId, "", CategoryType.Revenue);
                }
                if (update.CallbackQuery.Data == "expense")
                {
                    AddCategory(userId, "", CategoryType.Expense);
                }
                await client.EditMessageTextAsync(chatId, messageId, "Введіть назву категорії");

                StateMachine.NextStep(userId);
                return;
            }
            if (StateMachine.GetCurrentStep(userId) == 2)
            {
                var category = _userCategories.Single(r => r.UserId == userId);
                category.Name = update.Message.Text;
                if (_dbContext.ContainsCategory(userId, category.Name, category.CategoryType))
                {
                    await client.SendTextMessageAsync(chatId, "Упс... така категорія вже існує, спробуйте ввести щось інше");

                    return;
                }
                _dbContext.Categories.Add(category);
                await _dbContext.SaveChangesAsync();

                var answer = $"{new Emoji(0x2705)} Категорію <u><b>{category.Name}</b></u> додано";
                answer += category.CategoryType == CategoryType.Expense ? " до витрат" : " в доходи";

                await client.SendTextMessageAsync(chatId, answer, ParseMode.Html);

                _userCategories.Remove(category);
                StateMachine.FinishCurrentCommand(userId);
            }
        }
示例#18
0
        public async Task OsuSet(
            [Name("Username")] string username,
            [Name("Default game mode")] int gameMode = 0
            )
        {
            var user = _context.OsuUsers.SingleOrDefault(u => u.DiscordId == Context.User.Id);

            if (user is null)
            {
                _context.Add(new OsuUser(Context.User.Id, username, gameMode));
                await _context.SaveChangesAsync();

                await ReplyAsync("User registered!");

                return;
            }
            user.OsuUsername     = username;
            user.DefaultGameMode = gameMode;
            await _context.SaveChangesAsync();

            await ReplyAsync("User updated!");
        }
示例#19
0
        private async Task GrantPermission(string discordUserId, Permission permission, BotDbContext dbContext, IDMChannel channel)
        {
            var user = await dbContext.Users.FirstOrDefaultAsync(u => u.DiscordUserId == discordUserId);

            user.UserPermissions.Add(new UserPermissions()
            {
                PermissionId = permission.Id, UserId = user.Id, User = user, Permission = permission
            });
            dbContext.Update(user);
            await dbContext.SaveChangesAsync();

            await channel.SendMessageAsync("Granted Permission");
        }
示例#20
0
        public static async Task AddUserToDbAsync(string userId)
        {
            if (!await IsUserInDbAsync(userId)) //check
            {
                var id = LogEventIdProvider.GetEventIdByType(LoggingEvent.UserDbAction);
                using (var dbContext = new BotDbContext(_config))
                {
                    var user = new User()
                    {
                        DiscordUserId = userId
                    };
                    await dbContext.Users.AddAsync(user);

                    await dbContext.SaveChangesAsync();

                    var defaultUserRole = await dbContext.Roles.FirstOrDefaultAsync(r => r.Description == "Default-User");

                    if (defaultUserRole == null)
                    {
                        defaultUserRole = new Role()
                        {
                            Description = "Default-User"
                        };
                        await dbContext.Roles.AddAsync(defaultUserRole);
                    }
                    var userRole = new UserRoles()
                    {
                        User = user, Role = defaultUserRole, RoleId = defaultUserRole.Id
                    };
                    user.Roles.Add(userRole);
                    dbContext.Users.Update(user);
                    await dbContext.SaveChangesAsync();

                    logger.LogInformation(id, LogMessageBuilder.Build(id, $"Added User {userId} to database"));
                }
            }
        }
示例#21
0
        public static async Task <int> AddUnknownNationsAsPendingAsync(List <string> newNations, bool sourceDumps)
        {
            int counter = 0;

            using (var context = new BotDbContext(_config))
            {
                var status = await context.NationStatuses.FirstOrDefaultAsync(n => n.Name == "pending");

                if (status == null)
                {
                    status = new NationStatus()
                    {
                        Name = "pending"
                    };
                    await context.NationStatuses.AddAsync(status);

                    await context.SaveChangesAsync();
                }
                foreach (string nationName in newNations)
                {
                    if (await context.Nations.FirstOrDefaultAsync(n => n.Name == nationName) == null)
                    {
                        var time = sourceDumps ? TimeZoneInfo.ConvertTimeToUtc(DumpDataService.LastDumpUpdateTimeUtc, TimeZoneInfo.Local) : DateTime.UtcNow;
                        await context.Nations.AddAsync(new Nation()
                        {
                            Name = nationName, StatusTime = time, Status = status, StatusId = status.Id
                        });

                        await context.SaveChangesAsync();

                        counter++;
                    }
                }
            }
            return(counter);
        }
示例#22
0
        private async Task <Chat> GetChatById(long chatId)
        {
            var chat = await _context.Chats.FirstOrDefaultAsync(ch => ch.ChatId == chatId);

            if (chat != null)
            {
                return(chat);
            }

            chat = new Chat(chatId);
            _context.Chats.Add(chat);
            await _context.SaveChangesAsync();

            return(chat);
        }
示例#23
0
        public static async Task SetNationStatusToAsync(Nation nation, string statusName)
        {
            using (var dbContext = new BotDbContext(_config))
            {
                var current = nation.Status;
                var status  = await dbContext.NationStatuses.FirstOrDefaultAsync(n => n.Name == statusName);

                if (status == null)
                {
                    status = new NationStatus()
                    {
                        Name = statusName
                    };
                    await dbContext.NationStatuses.AddAsync(status);

                    await dbContext.SaveChangesAsync();
                }
                nation.Status     = status;
                nation.StatusId   = status.Id;
                nation.StatusTime = DateTime.UtcNow;
                dbContext.Nations.Update(nation);
                await dbContext.SaveChangesAsync();
            }
        }
示例#24
0
        public async Task <StravaCredential> RefreshCredentialsForParticipant(LeaderboardParticipant participant)
        {
            StravaOauthResponse authResponse = null;
            StravaCredential    credential;

            try
            {
                credential = await GetCredentialsForParticipant(participant);

                authResponse = await _stravaApiService.RefreshAccessTokenAsync(credential.RefreshToken)
                               .ConfigureAwait(false);
            }
            catch (Exception e)
            {
                _logger.LogError(e, $"Failed to refresh access token for {participant.DiscordUserId}");
                throw new StravaException(StravaException.StravaErrorType.RefreshFailed);
            }

            credential.UpdateWithNewTokens(authResponse);
            _dbContext.Credentials.Update(credential);
            await _dbContext.SaveChangesAsync();

            return(credential);
        }
示例#25
0
    private async Task <IResult> SetGroup(string group, BotUser user)
    {
        if (!int.TryParse(group, out var intGroup))
        {
            return(new FailedResult("Укажите корректный номер группы."));
        }

        var isExists = _narfu.Students.IsCorrectGroup(intGroup);

        if (!isExists)
        {
            return(new FailedResult($"Группа с номером {intGroup} не найдена."));
        }

        var groupName = _narfu.Students.GetGroupByRealId(intGroup).Name;

        user.SetNarfuGroup(intGroup);
        await _db.SaveChangesAsync();

        return(new SuccessfulResult
        {
            Message = $"Группа успешно установлена на {intGroup} ({groupName})"
        });
    }
示例#26
0
        public static async Task SetOneValueDbContextAsync(Guid clientId)
        {
            using BotDbContext db = CreateMemoryDbContext();

            db.TelegramUsers.Add(new TelegramUser {
                Id = 123456789, UserName = "******"
            });
            db.AzureApps.Add(new AzureApp {
                Id = clientId, Email = "*****@*****.**", Secrets = string.Empty, TelegramUserId = 123456789
            });
            db.AppAuths.Add(new AppAuth {
                Name = "test", RefreshToken = string.Empty, Scope = DefaultGraphApi.Scope, AzureAppId = clientId
            });

            await db.SaveChangesAsync();
        }
示例#27
0
        public static async Task RemoveUserFromDbAsync(string userId)
        {
            using (var dbContext = new BotDbContext(_config))
            {
                var user = await dbContext.Users.FirstOrDefaultAsync(u => u.DiscordUserId == userId);

                if (user != null)
                {
                    var id = LogEventIdProvider.GetEventIdByType(LoggingEvent.UserDbAction);
                    dbContext.Remove(user);
                    await dbContext.SaveChangesAsync();

                    logger.LogInformation(id, LogMessageBuilder.Build(id, $"Removed User {userId} from database"));
                }
            }
        }
示例#28
0
        public async Task PrefixSet([Name("Prefix")] string prefix)
        {
            var config = _dbContext.Configurations.SingleOrDefault(c => c.GuildId == Context.Guild.Id);

            if (config is null)
            {
                _dbContext.Add(new ServerConfiguration(Context.Guild.Id, prefix));
            }
            else
            {
                config.Prefix = prefix;
            }

            await _dbContext.SaveChangesAsync();

            await ReplyAsync("Prefix set!");
        }
示例#29
0
    public async Task CheckAndRemoveUserGroups()
    {
        var users = await _context.BotUsers.ToArrayAsync();

        foreach (var user in users)
        {
            if (_narfuApi.Students.IsCorrectGroup(user.NarfuGroup))
            {
                continue;
            }

            user.SetNarfuGroup(0);
            user.SetHasSchedule(false);
        }

        await _context.SaveChangesAsync();
    }
        private async Task ClearSavedMessage(Message message, ServicesContext serviceContext, BotDbContext dbContext)
        {
            var messageParts = message.Text.Split(' ');
            var client       = serviceContext.TelegramBotService.Client;
            var table        = dbContext.AdminSavedMessages;
            IQueryable <AdminSavedMessages> results;

            if (messageParts.Length >= 2)
            {
                results = table.Where(savedMessage => savedMessage.ChatId == message.Chat.Id && savedMessage.MessageTag == messageParts[1]);
            }
            else
            {
                results = table.Where(savedMessage => savedMessage.ChatId == message.Chat.Id);
            }
            table.RemoveRange(results);
            await dbContext.SaveChangesAsync();
        }