Esempio n. 1
0
        private Timer StartNewReminder(Reminder r)
        {
            var now = DateTime.Now;
            var twoMins = new TimeSpan(0, 2, 0);
            TimeSpan time = (r.When - now) < twoMins
                            ? twoMins       //if the time is less than 2 minutes,
                            : r.When - now; //it will send the message 2 minutes after start
                                            //To account for high bot startup times
            if (time.TotalMilliseconds > int.MaxValue)
                return null;
            var t = new Timer(time.TotalMilliseconds);
            t.Elapsed += async (s, e) =>
            {
                try
                {
                    Channel ch;
                    if (r.IsPrivate)
                    {
                        ch = NadekoBot.Client.PrivateChannels.FirstOrDefault(c => (long)c.Id == r.ChannelId);
                        if (ch == null)
                            ch = await NadekoBot.Client.CreatePrivateChannel((ulong)r.ChannelId);
                    }
                    else
                        ch = NadekoBot.Client.GetServer((ulong)r.ServerId)?.GetChannel((ulong)r.ChannelId);

                    if (ch == null)
                        return;

                    await ch.SendMessage($"❗⏰**I've been told to remind you to '{r.Message}' now by <@{r.UserId}>.**⏰❗");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Timer error! {ex}");
                }
                finally
                {
                    DbHandler.Instance.Delete<Reminder>(r.Id.Value);
                    t.Stop();
                    t.Dispose();
                }
            };
            t.Start();
            return t;
        }
Esempio n. 2
0
        internal override void Init(CommandGroupBuilder cgb)
        {
            cgb.CreateCommand(Module.Prefix + "remind")
                .Description("Sends a message to you or a channel after certain amount of time. " +
                             "First argument is me/here/'channelname'. Second argument is time in a descending order (mo>w>d>h>m) example: 1w5d3h10m. " +
                             "Third argument is a (multiword)message. " +
                             "\n**Usage**: `.remind me 1d5h Do something` or `.remind #general Start now!`")
                .Parameter("meorchannel", ParameterType.Required)
                .Parameter("time", ParameterType.Required)
                .Parameter("message", ParameterType.Unparsed)
                .Do(async e =>
                {
                    var meorchStr = e.GetArg("meorchannel").ToUpperInvariant();
                    Channel ch;
                    bool isPrivate = false;
                    if (meorchStr == "ME")
                    {
                        isPrivate = true;
                        ch = await e.User.CreatePMChannel().ConfigureAwait(false);
                    }
                    else if (meorchStr == "HERE")
                    {
                        ch = e.Channel;
                    }
                    else
                    {
                        ch = e.Server.FindChannels(meorchStr).FirstOrDefault();
                    }

                    if (ch == null)
                    {
                        await e.Channel.SendMessage($"{e.User.Mention} Something went wrong (channel cannot be found) ;(").ConfigureAwait(false);
                        return;
                    }

                    var timeStr = e.GetArg("time");

                    var m = regex.Match(timeStr);

                    if (m.Length == 0)
                    {
                        await e.Channel.SendMessage("Not a valid time format blablabla").ConfigureAwait(false);
                        return;
                    }

                    string output = "";
                    var namesAndValues = new Dictionary<string, int>();

                    foreach (var groupName in regex.GetGroupNames())
                    {
                        if (groupName == "0") continue;
                        int value = 0;
                        int.TryParse(m.Groups[groupName].Value, out value);

                        if (string.IsNullOrEmpty(m.Groups[groupName].Value))
                        {
                            namesAndValues[groupName] = 0;
                            continue;
                        }
                        else if (value < 1 ||
                            (groupName == "months" && value > 1) ||
                            (groupName == "weeks" && value > 4) ||
                            (groupName == "days" && value >= 7) ||
                            (groupName == "hours" && value > 23) ||
                            (groupName == "minutes" && value > 59))
                        {
                            await e.Channel.SendMessage($"Invalid {groupName} value.").ConfigureAwait(false);
                            return;
                        }
                        else
                            namesAndValues[groupName] = value;
                        output += m.Groups[groupName].Value + " " + groupName + " ";
                    }
                    var time = DateTime.Now + new TimeSpan(30 * namesAndValues["months"] +
                                                            7 * namesAndValues["weeks"] +
                                                            namesAndValues["days"],
                                                            namesAndValues["hours"],
                                                            namesAndValues["minutes"],
                                                            0);

                    var rem = new Reminder
                    {
                        ChannelId = (long)ch.Id,
                        IsPrivate = isPrivate,
                        When = time,
                        Message = e.GetArg("message"),
                        UserId = (long)e.User.Id,
                        ServerId = (long)e.Server.Id
                    };
                    DbHandler.Instance.InsertData(rem);

                    reminders.Add(StartNewReminder(rem));

                    await e.Channel.SendMessage($"⏰ I will remind \"{ch.Name}\" to \"{e.GetArg("message").ToString()}\" in {output}. ({time:d.M.yyyy.} at {time:HH:m})").ConfigureAwait(false);
                });
        }
Esempio n. 3
0
        private Timer StartNewReminder(Reminder r)
        {
            var now = DateTime.Now;
            var twoMins = new TimeSpan(0, 2, 0);
            TimeSpan time = (r.When - now) < twoMins
                            ? twoMins       //if the time is less than 2 minutes,
                            : r.When - now; //it will send the message 2 minutes after start
                                            //To account for high bot startup times
            if (time.TotalMilliseconds > int.MaxValue)
                return null;
            var t = new Timer(time.TotalMilliseconds);
            t.Elapsed += async (s, e) =>
            {
                try
                {
                    Channel ch;
                    if (r.IsPrivate)
                    {
                        ch = NadekoBot.Client.PrivateChannels.FirstOrDefault(c => (long)c.Id == r.ChannelId);
                        if (ch == null)
                            ch = await NadekoBot.Client.CreatePrivateChannel((ulong)r.ChannelId).ConfigureAwait(false);
                    }
                    else
                        ch = NadekoBot.Client.GetServer((ulong)r.ServerId)?.GetChannel((ulong)r.ChannelId);

                    if (ch == null)
                        return;

                    await ch.SendMessage(
                        replacements.Aggregate(NadekoBot.Config.RemindMessageFormat,
                        (cur, replace) => cur.Replace(replace.Key, replace.Value(r)))
                            ).ConfigureAwait(false); //it works trust me

                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Timer error! {ex}");
                }
                finally
                {
                    DbHandler.Instance.Delete<Reminder>(r.Id.Value);
                    t.Stop();
                    t.Dispose();
                }
            };
            t.Start();
            return t;
        }