示例#1
0
        public override async Task <bool> ActivateAsync(IPost n, IShell shell, Server core)
        {
            if (n.Text == null)
            {
                return(false);
            }
            var m = Regex.Match(n.Text.TrimMentions(), @"(.+)(って|と)呼[べびん]");

            if (m.Success)
            {
                switch (core.GetRatingOf(n.User))
                {
                case Rating.Hate:
                    await shell.ReplyAsync(n, "...");

                    break;

                case Rating.Normal:
                    await shell.ReplyAsync(n, "もう少し仲良くなってから,もう一度お願いしてね");

                    break;

                default:
                    var nick = m.Groups[1].Value;
                    core.SetNicknameOf(n.User, nick);
                    EconomyModule.Pay(n, shell, core);
                    core.LikeWithLimited(n.User);
                    await shell.ReplyAsync(n, $"わかった.これからは{core.GetNicknameOf(n.User)}と呼ぶね.\nよろしくね,{core.GetNicknameOf(n.User)}");

                    break;
                }
                return(true);
            }
            return(false);
        }
示例#2
0
        public override async Task <bool> ActivateAsync(IPost n, IShell shell, Server core)
        {
            if (n.Text == null)
            {
                return(false);
            }
            if (core.GetRatingOf(n.User) == Rating.Hate)
            {
                return(false);
            }
            await Task.Delay(4000);

            var reg  = Regex.Match(n.Text.TrimMentions(), @"(.+)(から褒めて|の(えら|偉)い)");
            var reg2 = Regex.Match(n.Text.TrimMentions(), @"褒めて|(えら|偉)い\??");

            if (reg.Success)
            {
                await shell.ReplyAsync(n, $"{reg.Groups[1].Value}のえらいです");

                core.Storage[n.User].Add(StatEraitedCount);
                core.LikeWithLimited(n.User);
                EconomyModule.Pay(n, shell, core);
                return(true);
            }
            else if (reg2.Success)
            {
                await shell.ReplyAsync(n, "えらいです");

                core.Storage[n.User].Add(StatEraitedCount);
                EconomyModule.Pay(n, shell, core);
                core.LikeWithLimited(n.User);
                return(true);
            }
            return(false);
        }
示例#3
0
        public override async Task <bool> ActivateAsync(IPost n, IShell shell, Server core)
        {
            if (n.Text is string text && text.IsMatch("おじさんの(真似|まね)"))
            {
                EconomyModule.Pay(n, shell, core);
                await Task.Delay(4000);

                core.LikeWithLimited(n.User);
                core.Storage[n.User].Add(StatOjisanedCount);
                await shell.ReplyAsync(n, await core.ExecCommand("/ojisan " + core.GetNicknameOf(n.User)));

                return(true);
            }
            return(false);
        }
示例#4
0
        public override async Task <bool> ActivateAsync(IPost n, IShell shell, Server core)
        {
            if (n.Text != null && n.Text.Contains("じゃんけん"))
            {
                core.LikeWithLimited(n.User);
                var note = await shell.ReplyAsync(n, "負けませんよ.最初は✊,じゃんけん――");

                if (note == null)
                {
                    return(true);
                }
                EconomyModule.Pay(n, shell, core);
                core.RegisterContext(note, this);
                return(true);
            }

            return(false);
        }
示例#5
0
        public override async Task <bool> ActivateAsync(IPost n, IShell shell, Server core)
        {
            var t = n.Text?.TrimMentions();

            if (string.IsNullOrEmpty(t))
            {
                return(false);
            }
            if (t.StartsWith("/"))
            {
                string response;
                try
                {
                    response = await core.ExecCommand(new PostCommandSender(n, core.IsSuperUser(n.User)), t);

                    core.Storage[n.User].Add(StatCommandUsedCount);
                }
                catch (AdminOnlyException)
                {
                    response = "ごめん,そのコマンドは管理者以外に言われても実行するなと言われてるの";
                }
                catch (LocalOnlyException)
                {
                    response = "このコマンドは同じインスタンスのユーザーしか使えないよ.ごめんね.";
                }
                catch (RemoteOnlyException)
                {
                    response = "このコマンドは違うインスタンスのユーザーしか使えないよ.ごめんね.";
                }
                catch (NoSuchCommandException)
                {
                    response = $"No such command.";
                }

                if (!string.IsNullOrWhiteSpace(response))
                {
                    await shell.ReplyAsync(n, response);
                }
                EconomyModule.Pay(n, shell, core);
                return(true);
            }
            return(false);
        }
示例#6
0
        public override async Task <bool> ActivateAsync(IPost n, IShell shell, Server core)
        {
            if (n.Text is string)
            {
                var m = Regex.Match(n.Text.TrimMentions(), "^(.+)(握|にぎ)");
                if (m.Success)
                {
                    var target = m.Groups[1].Value;
                    if (target.Contains("寿司") | target.Contains("すし"))
                    {
                        var candidates = core.GetRatingOf(n.User) == Rating.Hate ? dusts : sushi;
                        var res        = "";
                        var s          = random.Next(10) > 3 ? null : candidates.Random();
                        var max        = random.Next(1, 10);
                        for (var i = 0; i < max; i++)
                        {
                            res += s ?? candidates.Random();
                        }
                        await shell.ReplyAsync(n, "ヘイお待ち! " + res);

                        core.Storage[n.User].Add(StatSushiCount);
                        EconomyModule.Pay(n, shell, core);
                        core.LikeWithLimited(n.User);
                    }
                    else if (target.Length < 5)
                    {
                        await shell.ReplyAsync(n, messagesNigiri.Random().Replace("$user$", core.GetNicknameOf(n.User)).Replace("$thing$", target));

                        EconomyModule.Pay(n, shell, core);
                        core.LikeWithLimited(n.User);
                    }
                    else
                    {
                        await shell.ReplyAsync(n, messagesReject.Random().Replace("$user$", core.GetNicknameOf(n.User)).Replace("$thing$", target));

                        EconomyModule.Pay(n, shell, core);
                        core.LikeWithLimited(n.User);
                    }
                    return(true);
                }
            }
            return(false);
        }
示例#7
0
        private async Task TranslateAsync(string from, string to, string text, IPost n, IShell shell, Server core)
        {
            core.LikeWithLimited(n.User);
            var result = await core.ExecCommand($"/translate {from} {to} {text}");

            var reply = await shell.ReplyAsync(n, result);

            if (reply == null)
            {
                return;
            }

            EconomyModule.Pay(n, shell, core);
            core.LikeWithLimited(n.User);
            core.RegisterContext(reply, this, new Dictionary <string, object>()
            {
                { "result", result },
                { "code", to },
            });
        }
示例#8
0
        public override async Task <bool> ActivateAsync(IPost n, IShell shell, Server core)
        {
            if (n.User.Id == shell.Myself?.Id)
            {
                return(false);
            }

            if (n.Text == null)
            {
                return(false);
            }

            var m = Regex.Match(n.Text, "((?:\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]|[\\:a-z0-9A-Z_]+))を?[投な]げ[てろよ]");

            if (m.Success)
            {
                core.LikeWithLimited(n.User);
                EconomyModule.Pay(n, shell, core);
                await shell.ReactAsync(n, m.Groups[1].Value.Trim());

                core.Storage[n.User].Add(StatReactCount);
                return(true);
            }
            else if (IsTerribleText(n.Text))
            {
                core.OnHarassment(n.User);
                await shell.ReactAsync(n, "😥");

                core.Storage[n.User].Add(StatBadMouthCount);
                var rate = core.GetRatingOf(n.User);
                await shell.ReplyAsync(n, (rate == Rating.Hate ? ponkotsuPatternHate : rate == Rating.Normal ? ponkotsuPattern : ponkotsuPatternLove).Random());

                return(true);
            }

            return(false);
        }
示例#9
0
        public async override Task <bool> ActivateAsync(IPost n, IShell shell, Server core)
        {
            if (n.Text != null)
            {
                var storage = core.GetMyStorage();
                var map     = storage.Get("kawaiiMap", new Dictionary <string, string>());

                void SaveMap() => storage.Set("kawaiiMap", map);

                if (storage.Has("kawaiiList"))
                {
                    // レガシーな可愛いリストがあったらマイグレをする
                    var list = storage.Get("kawaiiList", new List <string>());
                    list.ForEach(k => map[k] = "かわいい");
                    logger.Info($"Migrated {list.Count} kawaii things from the list.");
                    storage.Clear("kawaiiList");
                }

                var input = n.Text.TrimMentions();

                var adjectiveCombined = $"{adjectiveKawaii}|{adjectiveKawaikunai}|{adjectiveOishii}|{adjectiveMazui}";

                var teacherPattern  = Regex.Match(input, $"(.+)(?:は|って)({adjectiveCombined})[でっ]?す?の?よ?");
                var questionPattern = Regex.Match(input, $"(.+)(?:は|って)({adjectiveCombined})(?:と(?:(?:思|おも)う)|ですか|の|かな)?[??]");
                var queryPattern    = Regex.Match(input, $"({adjectiveCombined})(?:もの|物|の|人|子|娘|ひと)(?:(?:は|って|とは|)(?:何|なに|誰|どなた|何方)|を(?:教|おし)えて)?[??]*");
                var isKawaii        = input.IsMatch(adjectiveKawaii);

                if (questionPattern.Success)
                {
                    await Task.Delay(4000);

                    var target = questionPattern.Groups[1].Value.Trim().ToLowerInvariant();

                    var response = map.ContainsKey(target) ? map[target] : "わかりません";
                    core.Storage[n.User].Add(StatKawaiiQuestionedCount);
                    await shell.ReplyAsync(n, response);
                }
                else if (teacherPattern.Success)
                {
                    await Task.Delay(4000);

                    var targetUnnormalized = teacherPattern.Groups[1].Value.Trim();
                    var target             = targetUnnormalized.ToLowerInvariant();
                    var adj = teacherPattern.Groups[2].Value.Trim();

                    if (target.IsMatch("シトリン|しとりん|citrine") && target.IsMatch(adjectiveKawaii))
                    {
                        // 自分を褒めてくれる場合は後続のモジュールが処理してくれることを期待
                        return(false);
                    }

                    // 記憶
                    map[target] = adj;
                    SaveMap();
                    core.Storage[n.User].Add(StatKawaiiTeachedCount);
                    await shell.ReplyAsync(n, $"{targetUnnormalized}は{adj}... 覚えました");
                }
                else if (queryPattern.Success)
                {
                    await Task.Delay(4000);

                    // ランダムに可愛いものを引く
                    var adj   = queryPattern.Groups[1].Value.Trim();
                    var regex =
                        adj.IsMatch(adjectiveKawaii) ? adjectiveKawaii :
                        adj.IsMatch(adjectiveKawaikunai) ? adjectiveKawaikunai :
                        adj.IsMatch(adjectiveOishii) ? adjectiveOishii :
                        adj.IsMatch(adjectiveMazui) ? adjectiveMazui : null;

                    var suggest = regex != null?map.Where(kv => kv.Value.IsMatch(regex)).Select(kv => kv.Key).Random() : null;

                    core.Storage[n.User].Add(StatKawaiiQueriedCount);
                    await shell.ReplyAsync(n, suggest != null?$"{suggest}はどう? {adj}よ" : $"{adj}もの,知らないです");
                }
                else
                {
                    return(false);
                }
                EconomyModule.Pay(n, shell, core);
                core.LikeWithLimited(n.User);
                return(true);
            }

            return(false);
        }
示例#10
0
        public async override Task <bool> ActivateAsync(IPost n, IShell shell, Server core)
        {
            if (n.Text != null && Regex.IsMatch(n.Text.ToLowerInvariant(), "占|運勢|みくじ|fortune"))
            {
                core.LikeWithLimited(n.User);
                var isPremium = EconomyModule.HasItem(n.User, "fortuneplus", core);
                var r         = new Random(n.User.Id.GetHashCode() + DateTime.Now.Day + DateTime.Now.Month - DateTime.Now.Year);

                int min = 1;
                int max = 6;

                int love  = r.Next(min, max),
                    money = r.Next(min, max),
                    work  = r.Next(min, max),
                    study = r.Next(min, max);

                // premium
                int health   = r.Next(min, max),
                    hobby    = r.Next(min, max),
                    sns      = r.Next(min, max),
                    gaming   = r.Next(min, max),
                    meal     = r.Next(min, max),
                    goingOut = r.Next(min, max),
                    shopping = r.Next(min, max);

                var builder = new StringBuilder();

                var list = new List <(string name, string emoji, int value, string bestMessage, string worstMessage)>
                {
                    ("恋愛運", "❤", love, "気になるあの人にアタックしてみては...?", "グイグイ迫るとかえって痛い目を見るかも."),
                    ("金運", "💰", money, "意外なことで得するかも.", "ぼったくりには気をつけてね."),
                    ("仕事運", "💻", work, "日頃の頑張りがきっと報われるよ.", "やる気が空回りして,大ミスしちゃわないように気をつけてね."),
                    ("勉強運", "📒", study, "昨日わからなかったことがわかる日かも.", "無理して勉強しても頭に入らないかも.")
                };

                if (isPremium)
                {
                    list.Add(("健康運", "💪", health, "今日一日バリバリ過ごせるでしょう.", "風邪を引かないよう気をつけて"));
                    list.Add(("趣味運", "🎸", hobby, "好きなことに打ち込もう!", "挫折に気をつけてね."));
                    list.Add(("食事運", "🍣", meal, "奮発して美味しい出前を取ろう.", "まずい食べ物に巡り合っちゃうかも"));
                    list.Add(("SNS運", "💬", sns, "喧嘩なく, 平和に過ごせるよ.", "何気ない発言で炎上しちゃうかも.気をつけて."));
                    list.Add(("ゲーム運", "🎮", gaming, "スコアが伸びる日だよ. やり込もう!", "頑張ってもスコアが伸びない日だよ. 無理はしないで."));
                    list.Add(("ステイホーム運", "🏠", goingOut, "のんびりお家で好きなことをして過ごそう.", "することに飽きてしまってませんか? 新たな趣味を見つける旅をしてみよう!"));
                    list.Add(("買いもの運", "👜", shopping, "思い切って,欲しかったものを買ってみては?", "不良品を引いちゃうかも. お買い物は程々に."));
                }

                var avg = (int)Math.Round(list.Average(el => el.value));

                builder.AppendLine($"***{results[avg - 1]}***");

                list.ForEach(r => builder.AppendLine($"{r.name}{r.emoji}: {GetStar(r.value, 5)}"));

                var luckyItem = GenerateWord(r);

                builder.AppendLine($"ラッキーアイテム💎: {luckyItem}");

                if (isPremium)
                {
                    var orderby = list.OrderByDescending(r => r.value);
                    var(name, emoji, value, bestMessage, worstMessage) = orderby.First();
                    var worst = orderby.Last();
                    builder
                    .AppendLine()
                    .Append("シトリンから一言: ")
                    .Append($"{worst.name}が低いね.{worst.worstMessage}")
                    .AppendLine($"{name}が高いね.{bestMessage}");
                }

                core.Storage[n.User].Add(StatFortuneCount);
                await shell.ReplyAsync(n, builder.ToString(), $"今日の{core.GetNicknameOf(n.User)}の運勢");

                EconomyModule.Pay(n, shell, core);
                return(true);
            }

            return(false);
        }