예제 #1
0
        public void Process(SyntaxNode node)
        {
            IMetricsDataStore storage = dataProvider.GetDataStore();
            var nodeKind = node.Kind();

            if (AssignmentSyntax.Contains(nodeKind))
            {
                IncrementOccurenceCount(AssignmentCount);
            }

            if (nodeKind == SyntaxKind.EqualsValueClause &&
                (node.Parent.IsKind(SyntaxKind.VariableDeclarator) || node.Parent.IsKind(SyntaxKind.PropertyDeclaration))
                )
            {
                IncrementOccurenceCount(AssignmentCount);
            }

            if (BranchingSyntax.Contains(nodeKind))
            {
                IncrementOccurenceCount(BranchingCount);
            }

            if (CallSyntax.Contains(nodeKind))
            {
                IncrementOccurenceCount(CallCount);
            }
        }
예제 #2
0
        public async Task <Response> Handle(Message message)
        {
            if (!message.Addressed)
            {
                return(null);
            }
            var match = Regex.Match(message.Text, @"^I go by ([\w/]+)\.?$", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return(null);
            }
            var pronouns = await _dataStoreProvider.GetDataStore("Pronouns");

            var key = match.Groups[1].Value.ToLowerInvariant();

            var pronoun = await pronouns.GetSingle(key);

            if (pronoun == null)
            {
                return(message.Respond($"Sorry, {message.From.Mention}, but I don't know that pronoun yet."));
            }

            var preferences = await _dataStoreProvider.GetDataStore("PronounPreferences");

            await preferences.Add(message.From.Id, pronoun.Key);

            return(message.Respond($"Ok, {message.From.Mention}."));
        }
        public async Task <string> GetValue(string variable, Message context)
        {
            var variableTypes = await _dataStoreProvider.GetDataStore("VariableTypes");

            var match = Regex.Match(variable, @"(.+)(?:(s)|(ed)|(en)|(ing))$", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return(null);
            }

            variable = match.Groups[1].Value;

            var type = await variableTypes.GetSingle(variable);

            if (type == null)
            {
                return(null);
            }

            var dataStore = await _dataStoreProvider.GetDataStore("Variables");

            if (match.Groups[2].Success && type.Value == "noun")
            {
                var noun = await dataStore.GetRandom(variable);

                if (noun == null)
                {
                    return(null);
                }
                return(await _conjugator.Plural(noun.Value));
            }

            var verb = await dataStore.GetRandom(variable);

            if (verb == null)
            {
                return(null);
            }
            if (match.Groups[2].Success && type.Value == "verb")
            {
                return(await _conjugator.ThirdPerson(verb.Value));
            }
            if (match.Groups[3].Success && type.Value == "verb")
            {
                return(await _conjugator.Past(verb.Value));
            }
            if (match.Groups[4].Success && type.Value == "verb")
            {
                return(await _conjugator.Participle(verb.Value));
            }
            if (match.Groups[5].Success && type.Value == "verb")
            {
                return(await _conjugator.Gerund(verb.Value));
            }

            return(null);
        }
예제 #4
0
        public async Task <Response> Respond(Message message)
        {
            var triggerLength = Int32.Parse(await _config.Get("FactoidTriggerLength", "6"));

            if (!message.Addressed && message.Text.Length < triggerLength)
            {
                return(null);
            }
            var trigger = message.Text;

            var dataStore = await _dataStoreProvider.GetDataStore("Factoids");

            var historyStore = await _dataStoreProvider.GetDataStore("FactoidHistory");

            var aliases = new HashSet <string>();

            while (true)
            {
                var reply = await dataStore.GetRandom(trigger);

                if (reply == null)
                {
                    return(null);
                }

                var factoid = ParseFactoid(trigger, reply.Value);

                if (factoid.Verb == "alias")
                {
                    if (!aliases.Add(trigger))
                    {
                        return(message.Respond("Oh no! There's a factoid that resolves to a circular reference!"));
                    }
                    trigger = factoid.Response;
                    continue;
                }

                await historyStore.SetSingle(message.Channel, $"(#{reply.Id}) \"{factoid.ToString()}\"");

                if (_random.Next(100) > factoid.ChanceToTrigger)
                {
                    return(null);
                }

                if (factoid.Verb == "reply")
                {
                    return(message.Respond(factoid.Response));
                }
                if (factoid.Verb == "action")
                {
                    return(message.Respond(factoid.Response, true));
                }

                return(message.Respond($"{trigger} {factoid.Verb} {factoid.Response}"));
            }
        }
예제 #5
0
        public void Process(SyntaxNode node)
        {
            IMetricsDataStore storage = dataProvider.GetDataStore();

            if (linesToCount.Contains(node.Kind()))
            {
                int currentComplexity;
                storage.TryGetDataItem <int>(CyclomaticComplexityeData, out currentComplexity);
                storage.SetDataItem <int>(CyclomaticComplexityeData, ++currentComplexity);
            }
        }
예제 #6
0
        public async Task <string> Get(string key, string defaultValue = null)
        {
            _log.Trace($"Getting config value for {key}");
            var dataStore = await _dataStoreProvider.GetDataStore("Config");

            var value = (await dataStore.GetAll(key)).FirstOrDefault();

            if (value == null)
            {
                _log.Debug($"No config value set for {key}, defaulting to {defaultValue ?? "null"}");
                return(defaultValue);
            }
            _log.Trace($"Successfully got config value \"{value.Value}\" for {key}");
            return(value.Value);
        }
예제 #7
0
        public async Task <Response> Handle(Message message)
        {
            if (!message.Addressed)
            {
                return(null);
            }
            var match = Regex.Match(message.Text, @"^delete var ([a-z][a-z0-9_-]*)$", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return(null);
            }

            var dataStore = await _dataStoreProvider.GetDataStore("Variables");

            var variable = match.Groups[1].Value.ToLowerInvariant();
            var values   = await dataStore.RemoveAll(variable);

            if (values == 0)
            {
                return(message.Respond($"There's no such variable, {message.From.Mention}!"));
            }
            if (values == 1)
            {
                return(message.Respond($"Ok, {message.From.Mention}, deleted variable \"{variable}\" and its value."));
            }
            return(message.Respond($"Ok, {message.From.Mention}, deleted variable \"{variable}\" and its {values} values."));
        }
예제 #8
0
        public async Task <Response> Handle(Message message)
        {
            if (!message.Addressed)
            {
                return(null);
            }

            var match = Regex.Match(message.Text, @"^add value ([a-z][a-z0-9_-]*) (.+)$", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return(null);
            }
            var dataStore = await _dataStoreProvider.GetDataStore("Variables");

            var variable = match.Groups[1].Value.ToLowerInvariant();
            var value    = match.Groups[2].Value;
            var added    = await dataStore.Add(variable, value);

            if (!added)
            {
                return(message.Respond($"I already had it that way, {message.From.Mention}!"));
            }
            return(message.Respond($"Ok, {message.From.Mention}."));
        }
예제 #9
0
        public async Task <string> Dump(string dataStore, string key)
        {
            var store = await _dataStoreProvider.GetDataStore(dataStore);

            var data = await store.GetAll(key);

            var subdirName = GetSlug(dataStore);
            var directory  = Path.Combine(_dataDumpDirectory, subdirName);

            if (!Directory.Exists(directory))
            {
                Directory.CreateDirectory(directory);
            }

            var filename = GetSlug(key);

            if (String.IsNullOrWhiteSpace(filename))
            {
                filename = "_";
            }
            filename = $"{filename}.txt";

            var dumpfile = Path.Combine(directory, filename);

            await File.WriteAllLinesAsync(dumpfile, data.Select(dsv => dsv.ToFullString()), Encoding.UTF8);

            var url = await _config.Get("DataDumpUrl", "http://example.com");

            var relative = $"{subdirName}/{filename}";

            return(new Uri(new Uri(url), relative).ToString());
        }
예제 #10
0
        public async Task <Response> Handle(Message message)
        {
            if (!message.Addressed)
            {
                return(null);
            }

            var match = Regex.Match(message.Text, @"^(.+) (<[^!@>]+>) (.+)$");

            if (!match.Success)
            {
                return(null);
            }
            var dataStore = await _dataStoreProvider.GetDataStore("Factoids");

            var trigger  = match.Groups[1].Value.ToLowerInvariant();
            var verb     = match.Groups[2].Value.ToLowerInvariant();
            var response = match.Groups[3].Value;

            if (verb == "alias" && String.Compare(trigger, response, true) == 0)
            {
                return(message.Respond($"Sorry, {message.From.Mention}, but you can't alias {trigger} to itself."));
            }

            var added = await dataStore.Add(trigger, $"{verb} {response}");

            if (!added)
            {
                return(message.Respond($"I already knew that, {message.From.Mention}!"));
            }
            return(message.Respond($"Ok, {message.From.Mention}."));
        }
예제 #11
0
        public async Task <Response> Handle(Message message)
        {
            if (!message.Addressed)
            {
                return(null);
            }
            var match = Regex.Match(message.Text, @"^literal (.+)$", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return(null);
            }
            var trigger = match.Groups[1].Value;

            var dataStore = await _dataStoreProvider.GetDataStore("Factoids");

            var values = await dataStore.GetAll(trigger);

            if (!values.Any())
            {
                return(message.Respond($"Sorry, {message.From.Mention}, but I don't know about \"{trigger}.\""));
            }

            if (values.Count() > 10 || values.Sum(x => x.Value.Length) > 500)
            {
                var url = await _dataDumper.Dump("Factoids", trigger);

                return(message.Respond($"{trigger}: {url}"));
            }

            var result = String.Join(", ", values.Select(x => $"(#{x.Id}) {x.Value}"));

            return(message.Respond($"{trigger}: {result}"));
        }
예제 #12
0
        public async Task <Response> Handle(Message message)
        {
            if (!message.Addressed)
            {
                return(null);
            }
            var match = Regex.Match(message.Text, @"^list var ([a-z][a-z0-9_-]*)", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return(null);
            }

            var dataStore = await _dataStoreProvider.GetDataStore("Variables");

            var variable = match.Groups[1].Value.ToLowerInvariant();
            var values   = await dataStore.GetAll(variable);

            if (!values.Any())
            {
                return(message.Respond($"There's no such variable, {message.From.Mention}!"));
            }

            if (values.Count() > 10 || values.Sum(x => x.Value.Length) > 500)
            {
                var url = await _dataDumper.Dump("Variables", variable);

                return(message.Respond($"${variable}: {url}"));
            }

            var list = String.Join(", ", values.Select(v => $"(#{v.Id}) {v.Value}"));

            return(message.Respond($"{variable}: {list}"));
        }
예제 #13
0
        public async Task <Response> Handle(Message message)
        {
            if (!message.Addressed)
            {
                return(null);
            }
            var match = Regex.Match(message.Text, @"^remove value (?:([a-z][a-z0-9_-]*) (.+)|#([0-9]+))$", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return(null);
            }
            var dataStore = await _dataStoreProvider.GetDataStore("Variables");

            var removed = false;

            if (match.Groups[1].Success && match.Groups[2].Success)
            {
                removed = await dataStore.Remove(match.Groups[1].Value.ToLowerInvariant(), match.Groups[2].Value);
            }
            else
            {
                removed = await dataStore.Remove(Int32.Parse(match.Groups[3].Value));
            }

            if (!removed)
            {
                return(message.Respond($"There's no such value, {message.From.Mention}!"));
            }
            return(message.Respond($"Ok, {message.From.Mention}"));
        }
예제 #14
0
        public async Task <Response> Handle(Message message)
        {
            if (!message.Addressed)
            {
                return(null);
            }

            var match = Regex.Match(message.Text, "^irregular (stem|present|past|participle|gerund|plural) ([a-z][a-z0-9_-]*) (?:=>)?(.+)$", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return(null);
            }

            var form        = match.Groups[1].Value.ToLowerInvariant();
            var word        = match.Groups[2].Value.ToLowerInvariant();
            var conjugation = match.Groups[3].Value.ToLowerInvariant();
            var key         = $"{word}.{form}";

            var dataStore = await _dataStoreProvider.GetDataStore("Irregulars");

            var success = await dataStore.SetSingle(key, conjugation);

            if (!success)
            {
                return(message.Respond($"Sorry, {message.From.Mention}, something went wrong."));
            }
            return(message.Respond($"Ok, {message.From.Mention}."));
        }
예제 #15
0
        public async Task <Response> Handle(Message message)
        {
            var match = _commandRegex.Match(message.Text);

            if (!match.Success)
            {
                return(null);
            }

            var inventory = await _dataStoreProvider.GetDataStore("Inventory");

            var items = (await inventory.GetAll("CurrentInventory"))
                        .Select(item => item.Value)
                        .ToList();

            if (items.Count == 0)
            {
                return(message.Respond("I have nothing."));
            }
            if (items.Count == 1)
            {
                return(message.Respond($"I have {items.Single()}."));
            }
            if (items.Count == 2)
            {
                return(message.Respond($"I have {items.First()} and {items.Last()}."));
            }

            return(message.Respond(
                       $"I have {string.Join(", ", items.Take(items.Count - 1))}, and {items.Last()}."
                       ));
        }
예제 #16
0
        public async Task Listen(Message message)
        {
            var chance = Int32.Parse(await _config.Get("PercentChanceOfPassiveFactoid", "10"));

            if (_random.Next(100) > chance)
            {
                return;
            }

            var match = Regex.Match(message.Text, @"^(.{0,42})\s+(is(?: also)?|are)\s+([^?]+)", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return;
            }

            _log.Debug("Someone said a factoid!");

            var dataStore = await _dataStoreProvider.GetDataStore("Factoids");

            var trigger = match.Groups[1].Value;
            var verb    = match.Groups[2].Value;
            var tidbit  = match.Groups[3].Value;

            await dataStore.Add(trigger, $"<{verb}> {tidbit}");
        }
예제 #17
0
        private async Task <string> GetPronoun(PartOfSpeech partOfSpeech, Message context)
        {
            var history = await _dataStoreProvider.GetDataStore("PersonHistory");

            var lastKnown = (await history.GetAll(context.Channel)).FirstOrDefault()?.Value;

            var preferences = await _dataStoreProvider.GetDataStore("PronounPreferences");

            var pronouns = await _dataStoreProvider.GetDataStore("Pronouns");

            var gender = lastKnown != null ? (await preferences.GetRandom(lastKnown))?.Value ?? "they" : "they";

            var list = (await pronouns.GetSingle(gender))?.Value ?? "they;them;their;theirs;themself";

            return(list.Split(';') [(int)partOfSpeech]);
        }
예제 #18
0
        public async Task <Response> Handle(Message message)
        {
            if (!message.Addressed)
            {
                return(null);
            }

            var match = Regex.Match(message.Text, @"^what was that\??$", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return(null);
            }

            var dataStore = await _dataStoreProvider.GetDataStore("FactoidHistory");

            var lastFactoid = (await dataStore.GetAll(message.Channel)).FirstOrDefault();

            if (lastFactoid == null)
            {
                return(message.Respond("¯\\_(ツ)_/¯"));
            }

            return(message.Respond($"{message.From.Mention}, that was {lastFactoid.Value}"));
        }
예제 #19
0
        public async Task <Response> Handle(Message message)
        {
            if (!message.Addressed)
            {
                return(null);
            }

            var match = Regex.Match(message.Text, @"^add pronoun ([a-z\/]+): ((?:\w+(?:[;,\s\/]+\b|$)){5})$", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return(null);
            }

            var dataStore = await _dataStoreProvider.GetDataStore("Pronouns");

            var identifier = match.Groups[1].Value.ToLowerInvariant();

            if ((await dataStore.GetSingle(identifier)) != null)
            {
                return(message.Respond($"I'm sorry, {message.From.Mention}, but I already know some pronouns for {identifier}."));
            }

            var pronouns = Regex.Split(match.Groups[2].Value.ToLowerInvariant(), @"[;,\s\/]+");

            await dataStore.SetSingle(identifier, String.Join(";", pronouns));

            return(message.Respond($"Ok, {message.From.Mention}."));
        }
예제 #20
0
        public async Task <Response> Handle(Message message)
        {
            if (!message.Addressed)
            {
                return(null);
            }
            var match = Regex.Match(message.Text, @"^var ([a-z][a-z0-9_-]*) (?:(?:is (?:a|type))|type) (var|verb|noun)$", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return(null);
            }

            var variable = match.Groups[1].Value.ToLowerInvariant();
            var type     = match.Groups[2].Value.ToLowerInvariant();

            var dataStore = await _dataStoreProvider.GetDataStore("VariableTypes");

            var success = await dataStore.SetSingle(variable, type);

            if (!success)
            {
                return(message.Respond($"Sorry, {message.From}, I'm afraid I can't do that."));
            }
            return(message.Respond($"Ok, {message.From}."));
        }
예제 #21
0
        public async Task <Response> Handle(Message message)
        {
            if (!message.Addressed)
            {
                return(null);
            }

            var match = Regex.Match(message.Text, @"^quote (\S+)$", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return(null);
            }

            var target = match.Groups[1].Value;
            var person = await _personProvider.GetPersonByName(message.Channel, target);

            if (person == null)
            {
                return(message.Respond($"Sorry, {message.From.Mention}, I don't know anyone named \"{target}.\""));
            }

            var quoteStore = await _dataStoreProvider.GetDataStore("Quotes");

            var quote = await quoteStore.GetRandom(person.Id);

            if (quote == null)
            {
                return(message.Respond($"Sorry, {person.Name} has not said anything quote-worthy yet."));
            }

            return(message.Respond($"<{person.Name}> {quote.Value}"));
        }
        public async Task <string> GetValue(string variable, Message context)
        {
            var match = Regex.Match(variable, @"(?:band|tla)", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return(null);
            }
            var dataStore = await _dataStoreProvider.GetDataStore("BandNames");

            return((await dataStore.GetRandom())?.Value);
        }
예제 #23
0
        public async Task <string> GetValue(string variable, Message context)
        {
            var match = Regex.Match(variable, @"(?:(who)|(to)|(someone))", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return(null);
            }

            var dataStore = await _dataStoreProvider.GetDataStore("PersonHistory");

            if (match.Groups[1].Success)
            {
                await dataStore.SetSingle(context.Channel, context.From.Id);

                return(context.From.Name);
            }

            if (match.Groups[2].Success)
            {
                // We need to handle this differently since the message might be
                // addressed to something or someone that isn't a known person.
                Person to = null;
                if (context.To != null)
                {
                    to = await _personProvider.GetPersonByName(context.Channel, context.To);

                    if (to == null)
                    {
                        await dataStore.SetSingle(context.Channel, context.To);

                        return(context.To);
                    }
                }
                to = to ?? await GetSomeone(context.Channel) ?? context.From;

                await dataStore.SetSingle(context.Channel, to.Id);

                return(to.Name);
            }

            if (match.Groups[3].Success)
            {
                var someone = await GetSomeone(context.Channel) ?? context.From;

                await dataStore.SetSingle(context.Channel, someone.Id);

                return(someone.Name);
            }

            return(null);
        }
예제 #24
0
        public override async Task Initialize()
        {
            var dataStore = await _dataStoreProvider.GetDataStore("Pronouns");

            var keys = await dataStore.GetAllKeys();

            if (keys.Any())
            {
                return;
            }

            // Seed data
            await Task.WhenAll(_seedData.Select(kvp => dataStore.Add(kvp.Key, kvp.Value)));
        }
예제 #25
0
        public async Task <Response> Respond(Message message)
        {
            var match = Regex.Match(message.Text, @"^([a-z]\w*)\s+([a-z]\w*)\s+([a-z]\w*)$", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return(null);
            }

            var bandChance = Int32.Parse(await _config.Get("PercentChanceOfBandName", "5"));

            if (_random.Next(0, 100) > bandChance)
            {
                return(null);
            }

            var bandNameDataStore = await _dataStoreProvider.GetDataStore("BandNames");

            var words = new [] { match.Groups[1].Value, match.Groups[2].Value, match.Groups[3].Value };

            var expanded = String.Join(" ", words);
            var tla      = String.Concat(words.Select(x => x.First())).ToUpperInvariant();

            if (!await bandNameDataStore.Add(tla, expanded))
            {
                return(null);
            }

            var factoids = await _dataStoreProvider.GetDataStore("Factoids");

            var reply = (await factoids.GetRandom("band name reply"))?.Value ?? "\"$band\" would be a cool name for a band.";

            reply = reply.Replace("<reply> ", "");
            reply = Regex.Replace(reply, @"\$(?:band|tla)", expanded, RegexOptions.IgnoreCase);

            return(message.Respond(reply));
        }
예제 #26
0
        public async Task <Response> Handle(Message message)
        {
            if (!message.Addressed)
            {
                return(null);
            }

            var match = Regex.Match(message.Text, @"^(.+) (<[^!@>]+>) (.+)$");

            if (!match.Success)
            {
                return(null);
            }
            var dataStore = await _dataStoreProvider.GetDataStore("Factoids");

            var trigger = match.Groups[1].Value.ToLowerInvariant();
            var verb    = match.Groups[2].Value.ToLowerInvariant();

            var percentMatch = Regex.Match(verb, @"\|(?!.*\|)(.*?)%>$");

            if (percentMatch.Success)
            {
                decimal chanceToTrigger;
                if (!Decimal.TryParse(percentMatch.Groups[1].Value, out chanceToTrigger))
                {
                    return(message.Respond($"Sorry, {message.From.Mention}, but {verb} is not properly formatted."));
                }

                if (chanceToTrigger <= 0 || chanceToTrigger > 100)
                {
                    return(message.Respond($"Sorry, {message.From.Mention}, but {verb} does not contain a valid percentage."));
                }
            }

            var response = match.Groups[3].Value;

            if (verb == "<alias>" && String.Compare(trigger, response, true) == 0)
            {
                return(message.Respond($"Sorry, {message.From.Mention}, but you can't alias {trigger} to itself."));
            }

            var added = await dataStore.Add(trigger, $"{verb} {response}");

            if (!added)
            {
                return(message.Respond($"I already knew that, {message.From.Mention}!"));
            }
            return(message.Respond($"Ok, {message.From.Mention}."));
        }
        public async Task <Response> Respond(Message message)
        {
            var item = GetItem(message);

            if (item == null)
            {
                return(null);
            }

            var inventory = await _dataStoreProvider.GetDataStore("Inventory");

            var items = (await inventory.GetAll("CurrentInventory")).ToList();

            if (await inventory.Contains("CurrentInventory", item))
            {
                // already exists
                return(await FactoidResponse(message, "duplicate item", "I already have $item.", ("item", item)));
            }

            Response response = null;
            var      limit    = Int32.Parse(await _config.Get("InventoryLimit", "10"));

            if (await inventory.GetCount("CurrentInventory") >= limit)
            {
                // drop something
                var dropped = await inventory.GetRandom("CurrentInventory");

                if (dropped != null) // beware race conditions
                {
                    await inventory.Remove(dropped.Id);

                    response = await FactoidResponse(message, "drops item", "I take $newitem and drop $giveitem.", ("newitem", item), ("giveitem", dropped.Value));
                }
            }

            await inventory.Add("CurrentInventory", item);

            if (!await inventory.Contains("History", item))
            {
                await inventory.Add("History", item);
            }

            if (response == null)
            {
                response = await FactoidResponse(message, "takes item", "I now have $item.", ("item", item));
            }
            return(response);
        }
예제 #28
0
        public async Task Listen(Message message)
        {
            var match = Regex.Match(message.Text, @"^(.{0,42})\s+(is(?: also)?|are)\s+(.+)", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return;
            }

            var dataStore = await _dataStoreProvider.GetDataStore("Factoids");

            var trigger = match.Groups[1].Value;
            var verb    = match.Groups[2].Value;
            var tidbit  = match.Groups[3].Value;

            await dataStore.Add(trigger, $"<{verb}> {tidbit}");
        }
예제 #29
0
        public override async Task Initialize()
        {
            var bandNameChance = await _config.Get("PercentChanceOfBandName");

            if (bandNameChance == null)
            {
                await _config.Set("PercentChanceOfBandName", "5");
            }

            var factoids = await _dataStoreProvider.GetDataStore("Factoids");

            var values = await factoids.GetAll("band name reply");

            if (!values.Any())
            {
                await factoids.Add("band name reply", "<reply> \"$band\" would be a cool name for a band.");
            }
        }
예제 #30
0
        public async Task <Response> Handle(Message message)
        {
            if (!message.Addressed)
            {
                return(null);
            }

            var match = Regex.Match(message.Text, @"^remember (\S+) (.+)$", RegexOptions.IgnoreCase);

            if (!match.Success)
            {
                return(null);
            }

            var target = match.Groups[1].Value;
            var search = match.Groups[2].Value;

            var person = await _personProvider.GetPersonByName(message.Channel, target);

            if (person == null)
            {
                return(message.Respond($"Sorry, {message.From.Mention}, I don't know anyone named \"{target}.\""));
            }
            if (person.Id == message.From.Id)
            {
                return(message.Respond($"Sorry, {message.From.Mention}, but you can't quote yourself."));
            }

            var history = await message.Messenger.GetMessageHistory(message.Channel);

            var matchingMessage = history.Where(x => x.From.Id == person.Id && x.Text.IndexOf(search, 0) > -1).FirstOrDefault();

            if (matchingMessage == null)
            {
                return(message.Respond($"Sorry, {message.From.Mention}, I don't remember what {target} said about \"{search}.\""));
            }

            var quoteStore = await _dataStoreProvider.GetDataStore("Quotes");

            await quoteStore.Add(person.Id, matchingMessage.Text);

            return(message.Respond($"You got it, {message.From.Mention}."));
        }