Exemplo n.º 1
0
 private string getLocalizedName(global::JetKarmaBot.Models.AwardType awardType, Locale loc)
 {
     if (loc.ContainsKey($"jetkarmabot.awardtypes.accusative.{awardType.CommandName}"))
     {
         return(loc[$"jetkarmabot.awardtypes.accusative.{awardType.CommandName}"]);
     }
     else
     {
         return(awardType.Name);
     }
 }
Exemplo n.º 2
0
        public async Task <bool> Execute(RequestContext ctx)
        {
            var db            = ctx.GetFeature <KarmaContext>();
            var currentLocale = ctx.GetFeature <Locale>();

            var awarder = ctx.EventArgs.Message.From;

            if (Timeout.TimeoutCache[awarder.Id].PreviousAwardDate.AddSeconds(Config.Timeout.AwardTimeSeconds) > DateTime.Now)
            {
                ctx.GetFeature <TimeoutManager.Feature>().Multiplier = 0; // Doesn't count as success or failure
                if (!Timeout.TimeoutCache[awarder.Id].TimeoutMessaged)
                {
                    await ctx.SendMessage(currentLocale["jetkarmabot.ratelimit"]);
                }
                Timeout.TimeoutCache[awarder.Id].TimeoutMessaged = true;
                return(false);
            }

            string awardTypeText = null;
            int    recipientId   = default(int);

            foreach (string arg in ctx.Command.Parameters)
            {
                if (arg.StartsWith('@'))
                {
                    if (recipientId != default(int))
                    {
                        await ctx.SendMessage(currentLocale["jetkarmabot.award.errdup"]);

                        return(false);
                    }
                    recipientId = await db.Users.Where(x => x.Username == arg).Select(x => x.UserId).FirstOrDefaultAsync();

                    if (recipientId == default(int))
                    {
                        await ctx.SendMessage(currentLocale["jetkarmabot.award.errbadusername"]);

                        return(false);
                    }
                }
                else
                {
                    if (awardTypeText == null)
                    {
                        awardTypeText = arg;
                    }
                    else
                    {
                        await ctx.SendMessage(currentLocale["jetkarmabot.award.errdup"]);

                        return(false);
                    }
                }
            }

            if (ctx.EventArgs.Message.ReplyToMessage != null && recipientId == default(int))
            {
                recipientId = ctx.EventArgs.Message.ReplyToMessage.From.Id;
            }

            if (recipientId == default(int))
            {
                await ctx.SendMessage(currentLocale["jetkarmabot.award.errawardnoreply"]);

                return(false);
            }


            bool awarding = ctx.Command.Command == "award";

            if (awarder.Id == recipientId)
            {
                await ctx.SendMessage(currentLocale["jetkarmabot.award.errawardself"]);

                return(false);
            }

            if (ctx.GetFeature <ChatCommandRouter.Feature>().Router.Me.Id == recipientId)
            {
                await ctx.SendMessage(awarding
                                      ?currentLocale["jetkarmabot.award.errawardbot"]
                                      : currentLocale["jetkarmabot.award.errrevokebot"]);

                return(false);
            }

            var text = ctx.EventArgs.Message.Text;

            global::JetKarmaBot.Models.AwardType awardType = awardTypeText != null
                ? await db.AwardTypes.FirstAsync(at => at.CommandName == awardTypeText)
                : await db.AwardTypes.FindAsync((sbyte)1);

            var prevCount = await db.Awards
                            .Where(aw => aw.ToId == recipientId && aw.AwardTypeId == awardType.AwardTypeId && aw.ChatId == ctx.EventArgs.Message.Chat.Id)
                            .SumAsync(aw => aw.Amount);

            await db.Awards.AddAsync(new Models.Award()
            {
                AwardTypeId = awardType.AwardTypeId,
                Amount      = (sbyte)(awarding ? 1 : -1),
                FromId      = awarder.Id,
                ToId        = recipientId,
                ChatId      = ctx.EventArgs.Message.Chat.Id
            });

            var recUserName = (await db.Users.FindAsync(recipientId)).Username;

            log.Debug($"Awarded {(awarding ? 1 : -1)}{awardType.Symbol} to {recUserName}");

            string message = awarding
                ? string.Format(currentLocale["jetkarmabot.award.awardmessage"], getLocalizedName(awardType, currentLocale), recUserName)
                : string.Format(currentLocale["jetkarmabot.award.revokemessage"], getLocalizedName(awardType, currentLocale), recUserName);


            var response = message + "\n" + String.Format(currentLocale["jetkarmabot.award.statustext"], recUserName, prevCount + (awarding ? 1 : -1), awardType.Symbol);

            await ctx.SendMessage(response);

            Timeout.TimeoutCache[awarder.Id].PreviousAwardDate = DateTime.Now;
            return(true);
        }