Ejemplo n.º 1
0
        private async Task <long> SendMessageAsync(StreamToCheck streamToCheck, TwitchStream stream)
        {
            Embed embed = null;

            if (streamToCheck.EmbedColor != 0)
            {
                embed = CreateEmbed(stream, (uint)streamToCheck.EmbedColor);
            }

            var channel = _client.GetChannel((ulong)streamToCheck.DiscordChannelId) as SocketTextChannel;
            var resp    = await channel.SendMessageAsync(streamToCheck.DiscordMessage, embed : embed);

            if (streamToCheck.PinMessage)
            {
                await resp.PinAsync();
            }

            return((long)resp.Id);
        }
 public TwitchUpdateJob(DiscordSocketClient client, TwitchService twitchService, StreamToCheck stream)
 {
     _client        = client;
     _twitchService = twitchService;
     _stream        = stream;
 }
Ejemplo n.º 3
0
        private async Task FinalMessageUpdateAsync(StreamToCheck streamToCheck, StreamRecord record)
        {
            List <StreamGame> games;

            using (var db = new DggContext())
            {
                var latest = db.StreamGames
                             .FirstOrDefault(g => g.StreamId == record.StreamId && g.StopTime == null);

                if (latest != null)
                {
                    latest.StopTime = DateTime.UtcNow;
                    await db.SaveChangesAsync();
                }

                games = await db.StreamGames.Where(g => g.StreamId == record.StreamId).ToListAsync();
            }

            record.StartTime = DateTime.SpecifyKind(record.StartTime, DateTimeKind.Utc);

            var streamDuration = DateTime.UtcNow - record.StartTime;
            var startTime      = TimeZoneInfo.ConvertTime(record.StartTime, Helpers.CentralTimeZone());
            var stopTime       = TimeZoneInfo.ConvertTime(DateTime.UtcNow, Helpers.CentralTimeZone());

            var msg = new StringBuilder(streamToCheck.FriendlyUsername + " was live.\n\n");

            msg.Append("**Started at:** ");
            msg.Append(startTime.ToString("HH:mm"));
            msg.Append(" Central\n");
            msg.Append("**Ended at:** ");
            msg.Append(stopTime.ToString("HH:mm"));
            msg.Append(" Central\n");
            msg.Append("_(total of ");
            msg.Append(streamDuration.ToFriendlyString());
            msg.Append(")_\n\n");

            msg.Append("__Games Played__");

            foreach (var g in games)
            {
                // i dunno why it's putting an empty game for 0 minutes first each time,
                // but here's a quick fix lel
                if (string.IsNullOrEmpty(g.Game))
                {
                    continue;
                }

                g.StopTime  = DateTime.SpecifyKind(g.StopTime.Value, DateTimeKind.Utc);
                g.StartTime = DateTime.SpecifyKind(g.StartTime, DateTimeKind.Utc);

                var duration = g.StopTime.Value - g.StartTime;
                msg.Append("\n**");
                msg.Append(g.Game);
                msg.Append(":** ");
                msg.Append(duration.ToFriendlyString());
            }

            try
            {
                var channel     = _client.GetChannel((ulong)streamToCheck.DiscordChannelId) as SocketTextChannel;
                var existingMsg = await channel.GetMessageAsync((ulong)record.DiscordMessageId) as RestUserMessage;

                await existingMsg.ModifyAsync(m =>
                {
                    m.Content = msg.ToString();
                    m.Embed   = null;
                });
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine("[" + DateTime.UtcNow + "] TWITCH ERROR, FinalMessageUpdateAsync");
                Console.Error.WriteLine(ex.ToString());
                Console.Error.WriteLine(ex.InnerException?.ToString());
                Console.Error.WriteLine("------------");
                Console.Error.WriteLine();
            }
        }
Ejemplo n.º 4
0
        public async Task AddTwitch(string twitchName, IGuildChannel guildChannel)
        {
            var response = await _twitchService.GetTwitchUserAsync(twitchName);

            if (response.Users is null)
            {
                await ReplyAsync("Unable to get Streamer from Twitch API");

                return;
            }
            await ReplyAsync("Please Enter in the Embed color in Hex format e.g. #ff851b\n" +
                             "You pick a color and get the code for here: <http://htmlcolorcodes.com>\n" +
                             "type in default to use the default color");

            var hexMessage = await NextMessageAsync(timeout : TimeSpan.FromSeconds(30));

            int hexColor;

            if (hexMessage.Content.Equals("default", StringComparison.OrdinalIgnoreCase))
            {
                hexColor = (int)Helpers.GetColorFromHex("#010aad").RawValue;
            }
            else
            {
                hexColor = (int)Helpers.GetColorFromHex(hexMessage.Content).RawValue;
            }

            await ReplyAsync("Please Enter a message you would like to go along with the twitch embed. Type in default for no message");

            var message = await NextMessageAsync(timeout : TimeSpan.FromSeconds(30));


            await ReplyAsync("Please Enter the stream URL. type in default to use twitch url");

            var urlMessage = await NextMessageAsync(timeout : TimeSpan.FromSeconds(30));

            await ReplyAsync("Please Enter a number for the priority");

            var priorityMessage = await NextMessageAsync(timeout : TimeSpan.FromSeconds(30));

            using (var context = new DggContext())
            {
                var user = response.Users.FirstOrDefault();
                if (await context.StreamsToCheck.FirstOrDefaultAsync(x => x.UserId == user.Id) is null)
                {
                    var streamToCheck = new StreamToCheck
                    {
                        DiscordChannelId     = (long)guildChannel.Id,
                        DiscordServerId      = (long)Context.Guild.Id,
                        UserId               = user.Id,
                        Frequency            = 60,
                        FriendlyUsername     = user.Name,
                        DeleteDiscordMessage = false,
                        PinMessage           = true,
                        Priority             = Convert.ToInt32(priorityMessage.Content),
                        StreamUrl            = urlMessage.Content.Equals("default", StringComparison.OrdinalIgnoreCase) ? $"https://twitch.tv/{user.Name}" : urlMessage.Content,
                        DiscordMessage       = message.Content.Equals("default", StringComparison.OrdinalIgnoreCase) ? String.Empty : message.Content,
                        EmbedColor           = hexColor
                    };

                    await context.StreamsToCheck.AddAsync(streamToCheck);

                    var changes = await context.SaveChangesAsync();

                    if (changes > 0)
                    {
                        Log.Information("{author} added Twitch Channel:{channel}", Context.Message.Author,
                                        twitchName);
                        await ReplyAsync($"{user.Name} added to the database");

                        JobManager.AddJob(new TwitchJob(Context.SocketClient, _twitchService, streamToCheck),
                                          s => s.WithName(streamToCheck.UserId.ToString()).ToRunEvery(streamToCheck.Frequency)
                                          .Seconds());
                        return;
                    }

                    await ReplyAsync($"Unable to save youtube to database");

                    return;
                }
                await ReplyAsync("Twitch account already exists in the Database");
            }
        }