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; }
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(); } }
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"); } }