Example #1
0
        private async Task <string> CreateReminder(ICommandContext context, string message)
        {
            var result = FuzzyParsing.Moment(message);

            string error = null;

            if (!result.IsValid)
            {
                error = result.ErrorMessage;
            }
            else if (result.Value < DateTime.UtcNow)
            {
                error = PastValueErrorMessage.Replace("$moment$", result.Value.ToString(CultureInfo.InvariantCulture));
            }

            if (error != null)
            {
                return(error);
            }
            else
            {
                var triggerTime = result.Value;
                var duration    = triggerTime - DateTime.UtcNow;

                //Add some context to the message
                var prelude = $"{context.Message.Author.Mention} Reminder from {DateTime.UtcNow.Humanize(dateToCompareAgainst: triggerTime, culture: CultureInfo.GetCultureInfo("en-gn"))}...";
                var msg     = $"remind me {message}";

                //Save to database
                var n = await _reminders.Create(triggerTime, prelude, msg, context.Message.Channel.Id, context.User.Id);

                var friendlyId = new FriendlyId32(n.ID);
                return($"I will remind you in {duration.Humanize(2, maxUnit: TimeUnit.Year, minUnit: TimeUnit.Second, toWords: true)} (id: `{friendlyId}`)");
            }
        }
Example #2
0
        public void AllZero()
        {
            const uint a   = 0;
            var        str = a.MeaninglessString();

            Console.WriteLine(str);
            var b = FriendlyId32.Parse(str);

            Assert.IsNotNull(b);
            Assert.AreEqual(a, b.Value.Value);
        }
Example #3
0
 public void ParseInvalid()
 {
     Assert.IsNull(FriendlyId32.Parse("aaaryc-racnes"));
     Assert.IsNull(FriendlyId32.Parse("molaaa-racnes"));
     Assert.IsNull(FriendlyId32.Parse("molryc-aaanes"));
     Assert.IsNull(FriendlyId32.Parse("molryc-racaaa"));
     Assert.IsNull(FriendlyId32.Parse("molrycracten"));
     Assert.IsNull(FriendlyId32.Parse("hello"));
     Assert.IsNull(FriendlyId32.Parse("hello-world"));
     Assert.IsNull(FriendlyId32.Parse("molryc-world"));
 }
Example #4
0
        public void Parse()
        {
            var str = "lomryc-racnes";
            var fid = FriendlyId32.Parse(str);

            Assert.IsTrue(fid.HasValue);
            Assert.AreEqual(str, fid.ToString());

            Console.WriteLine(str);
            Console.WriteLine(fid.Value.Value);
            Console.WriteLine(fid.ToString());
        }
Example #5
0
        public async Task CreatePendingPayment([NotNull] IUser user, decimal amount, [NotNull] string unit, [CanBeNull, Remainder] string note = null)
        {
            if (amount < 0)
            {
                await TypingReplyAsync("You cannot pay a negative amount!");
            }

            var id = await _pending.CreatePending(Context.User.Id, user.Id, amount, unit, note, DateTime.UtcNow);

            var fid = new FriendlyId32(id).ToString();

            await TypingReplyAsync($"{user.Mention} type `!confirm {fid}` to confirm that you have been paid this");
            await TypingReplyAsync($"{user.Mention} type `!deny {fid}` to deny that you received this payment. Please talk to the other user about why!");
        }
Example #6
0
        public async Task CancelReminder([NotNull] string id)
        {
            var parsed = FriendlyId32.Parse(id);

            if (!parsed.HasValue)
            {
                await TypingReplyAsync("Invalid ID");

                return;
            }

            if (await _reminders.Delete(parsed.Value.Value))
            {
                await TypingReplyAsync($"Deleted reminder `{id}`");
            }
            else
            {
                await TypingReplyAsync($"I can't find a reminder with id `{id}`");
            }
        }
Example #7
0
        private async Task PaginatedPending([NotNull] IAsyncEnumerable <IPendingTransaction> pending, string none, string paginatedHeader, bool mentionReceiver)
        {
            string FormatSinglePending(IPendingTransaction p, bool longForm)
            {
                var receiver = Name(p.ToId, mentionReceiver);
                var payer    = Name(p.FromId);
                var note     = string.IsNullOrEmpty(p.Note) ? "" : $"'{p.Note}'";
                var amount   = TransactionFormatting.FormatCurrency(p.Amount, p.Unit);

                var fid = new FriendlyId32(p.Id).ToString();

                if (longForm)
                {
                    return($"{receiver} Type `!confirm {fid}` or `!deny {fid}` to confirm/deny transaction of {amount} from {payer} {note}");
                }
                else
                {
                    return($"`{fid}`: {payer} paid {amount} to {receiver} {note}");
                }
            }

            var pendingArr = await pending.ToArray();

            if (pendingArr.Length == 0)
            {
                await TypingReplyAsync(none);
            }
            else if (pendingArr.Length < 5)
            {
                await ReplyAsync(string.Join("\n", pendingArr.Select(p => FormatSinglePending(p, true))));
            }
            else
            {
                await TypingReplyAsync(string.Format(paginatedHeader, pendingArr.Length));
                await PagedReplyAsync(new PaginatedMessage { Pages = pendingArr.Batch(7).Select(d => string.Join("\n", d.Select(p => FormatSinglePending(p, false)))) });
            }
        }
Example #8
0
        public async Task Confirm([NotNull] string input)
        {
            var fid = FriendlyId32.Parse(input);

            if (!fid.HasValue)
            {
                await TypingReplyAsync("Invalid ID `{id}`");

                return;
            }

            var transactions = await(await _pending.Get(debtId: fid.Value.Value)).ToArray();

            if (transactions.Length == 0)
            {
                await TypingReplyAsync($"Cannot find a transaction with ID `{fid}`");

                return;
            }

            if (transactions.Length > 1)
            {
                await TypingReplyAsync($"Found multiple transactions with ID `{fid}`! This is probably an error, please report it.");

                return;
            }

            var transaction = transactions[0];

            if (transaction.ToId != Context.User.Id)
            {
                await TypingReplyAsync("You cannot confirm this transaction");

                return;
            }

            var result = await _pending.ConfirmPending(fid.Value.Value);

            switch (result)
            {
            case ConfirmResult.Confirmed:
                await TypingReplyAsync($"Confirmed {TransactionFormatting.FormatTransaction(this, transaction)}");

                break;

            case ConfirmResult.AlreadyDenied:
                await TypingReplyAsync("This transaction has already been denied and cannot be confirmed");

                break;

            case ConfirmResult.AlreadyConfirmed:
                await TypingReplyAsync("This transaction has already been confirmed");

                break;

            case ConfirmResult.IdNotFound:
                await TypingReplyAsync($"Cannot find a transaction with ID `{fid}`! This is probably an error, please report it.");

                break;

            default:
                await TypingReplyAsync($"Unknown transaction state `{result}`! This is probably an error, please report it.");

                throw new ArgumentOutOfRangeException();
            }
        }