Compare commits
4 Commits
c21890b55d
...
48ac5c4fa0
| Author | SHA1 | Date | |
|---|---|---|---|
| 48ac5c4fa0 | |||
| d13cd71ac0 | |||
| 5067ffe119 | |||
| 9a17ad16b3 |
@@ -21,26 +21,27 @@ namespace TwitchChatTTS.Chat.Groups
|
||||
|
||||
public void Add(Group group)
|
||||
{
|
||||
_groups.Add(group.Name, group);
|
||||
_groups.Add(group.Id, group);
|
||||
}
|
||||
|
||||
public void Add(long chatter, string groupId)
|
||||
public void Add(long chatterId, string groupId)
|
||||
{
|
||||
if (_chatters.TryGetValue(chatter, out var list))
|
||||
list.Add(groupId);
|
||||
if (_chatters.TryGetValue(chatterId, out var list))
|
||||
if (!list.Contains(groupId))
|
||||
list.Add(groupId);
|
||||
else
|
||||
_chatters.Add(chatter, new List<string>() { groupId });
|
||||
_chatters.Add(chatterId, new List<string>() { groupId });
|
||||
}
|
||||
|
||||
public void Add(long chatter, ICollection<string> groupNames)
|
||||
public void Add(long chatter, ICollection<string> groupIds)
|
||||
{
|
||||
if (_chatters.TryGetValue(chatter, out var list))
|
||||
{
|
||||
foreach (var group in groupNames)
|
||||
foreach (var group in groupIds)
|
||||
list.Add(group);
|
||||
}
|
||||
else
|
||||
_chatters.Add(chatter, groupNames);
|
||||
_chatters.Add(chatter, groupIds);
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
@@ -49,9 +50,9 @@ namespace TwitchChatTTS.Chat.Groups
|
||||
_chatters.Clear();
|
||||
}
|
||||
|
||||
public Group? Get(string groupName)
|
||||
public Group? Get(string groupId)
|
||||
{
|
||||
if (_groups.TryGetValue(groupName, out var group))
|
||||
if (_groups.TryGetValue(groupId, out var group))
|
||||
return group;
|
||||
return null;
|
||||
}
|
||||
@@ -59,7 +60,9 @@ namespace TwitchChatTTS.Chat.Groups
|
||||
public IEnumerable<string> GetGroupNamesFor(long chatter)
|
||||
{
|
||||
if (_chatters.TryGetValue(chatter, out var groups))
|
||||
return groups.Select(g => _groups[g].Name);
|
||||
return groups.Select(g => _groups.TryGetValue(g, out var group) ? group.Name : null)
|
||||
.Where(g => g != null)
|
||||
.Cast<string>();
|
||||
|
||||
return Array.Empty<string>();
|
||||
}
|
||||
@@ -72,9 +75,9 @@ namespace TwitchChatTTS.Chat.Groups
|
||||
return GetPriorityFor(groups);
|
||||
}
|
||||
|
||||
public int GetPriorityFor(IEnumerable<string> groupNames)
|
||||
public int GetPriorityFor(IEnumerable<string> groupIds)
|
||||
{
|
||||
var values = groupNames.Select(g => _groups.TryGetValue(g, out var group) ? group : null).Where(g => g != null);
|
||||
var values = groupIds.Select(g => _groups.TryGetValue(g, out var group) ? group : null).Where(g => g != null);
|
||||
if (values.Any())
|
||||
return values.Max(g => g!.Priority);
|
||||
return 0;
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
|
||||
var group = _groups.Get(policy.GroupId.ToString());
|
||||
if (group == null)
|
||||
{
|
||||
_logger.Warning($"Policy data is failed: group id not found [group id: {policy.GroupId}][policy id: {policy.Id}]");
|
||||
_logger.Warning($"Policy's group id not found [group id: {policy.GroupId}][policy id: {policy.Id}]");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
|
||||
|
||||
foreach (var chatter in groupInfo.GroupChatters)
|
||||
if (groupsById.TryGetValue(chatter.GroupId, out var group))
|
||||
_groups.Add(chatter.ChatterId, group.Name);
|
||||
_groups.Add(chatter.ChatterId, group.Id);
|
||||
_logger.Information($"Users in each group [count: {groupInfo.GroupChatters.Count()}] have been loaded.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
|
||||
var group = _groups.Get(policy.GroupId.ToString());
|
||||
if (group == null)
|
||||
{
|
||||
_logger.Debug($"Policy data failed: group id not found [group id: {policy.GroupId}][policy id: {policy.Id}]");
|
||||
_logger.Debug($"Policy's group id not found [group id: {policy.GroupId}][policy id: {policy.Id}]");
|
||||
continue;
|
||||
}
|
||||
_logger.Debug($"Policy data loaded [policy id: {policy.Id}][path: {policy.Path}][group id: {policy.GroupId}][group name: {group.Name}]");
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
|
||||
{
|
||||
public class UpdateGroupAck : IRequestAck
|
||||
{
|
||||
public string Name => "create_group";
|
||||
public string Name => "update_group";
|
||||
private readonly IChatterGroupManager _groups;
|
||||
private readonly JsonSerializerOptions _options;
|
||||
private readonly ILogger _logger;
|
||||
|
||||
@@ -24,16 +24,22 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
|
||||
|
||||
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
|
||||
{
|
||||
if (json == null)
|
||||
{
|
||||
_logger.Warning($"Policy JSON data is null.");
|
||||
return;
|
||||
}
|
||||
|
||||
var policy = JsonSerializer.Deserialize<Policy>(json, _options);
|
||||
if (policy == null)
|
||||
{
|
||||
_logger.Warning($"Policy data failed: null");
|
||||
_logger.Warning($"Policy data is null.");
|
||||
return;
|
||||
}
|
||||
var group = _groups.Get(policy.GroupId.ToString());
|
||||
if (group == null)
|
||||
{
|
||||
_logger.Warning($"Policy data failed: group id not found [group id: {policy.GroupId}][policy id: {policy.Id}]");
|
||||
_logger.Warning($"Policy's group id not found [group id: {policy.GroupId}][policy id: {policy.Id}]");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,10 +21,16 @@ namespace TwitchChatTTS.Hermes.Socket.Requests
|
||||
|
||||
public void Acknowledge(string requestId, string? json, IDictionary<string, object>? requestData)
|
||||
{
|
||||
if (json == null)
|
||||
{
|
||||
_logger.Warning($"TTS Filter JSON data is null.");
|
||||
return;
|
||||
}
|
||||
|
||||
var filter = JsonSerializer.Deserialize<TTSWordFilter>(json, _options);
|
||||
if (filter == null)
|
||||
{
|
||||
_logger.Warning($"TTS Filter data failed: null");
|
||||
_logger.Warning($"TTS Filter data is null.");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -87,12 +87,16 @@ s.AddTransient<ICommandFactory, CommandFactory>();
|
||||
|
||||
// Request acks
|
||||
s.AddSingleton<RequestAckManager>();
|
||||
s.AddTransient<IRequestAck, CreateGroupAck>();
|
||||
s.AddTransient<IRequestAck, CreateGroupChatterAck>();
|
||||
s.AddTransient<IRequestAck, CreatePolicyAck>();
|
||||
s.AddTransient<IRequestAck, CreateRedeemableActionAck>();
|
||||
s.AddTransient<IRequestAck, CreateRedemptionAck>();
|
||||
s.AddTransient<IRequestAck, CreateTTSFilterAck>();
|
||||
s.AddTransient<IRequestAck, CreateTTSUserAck>();
|
||||
s.AddTransient<IRequestAck, CreateTTSVoiceAck>();
|
||||
s.AddTransient<IRequestAck, DeleteGroupAck>();
|
||||
s.AddTransient<IRequestAck, DeleteGroupChatterAck>();
|
||||
s.AddTransient<IRequestAck, DeletePolicyAck>();
|
||||
s.AddTransient<IRequestAck, DeleteRedeemableActionAck>();
|
||||
s.AddTransient<IRequestAck, DeleteRedemptionAck>();
|
||||
@@ -110,6 +114,8 @@ s.AddTransient<IRequestAck, GetRedemptionsAck>();
|
||||
s.AddTransient<IRequestAck, GetTTSUsersAck>();
|
||||
s.AddTransient<IRequestAck, GetTTSVoicesAck>();
|
||||
s.AddTransient<IRequestAck, GetTTSWordFiltersAck>();
|
||||
s.AddTransient<IRequestAck, UpdateGroupAck>();
|
||||
s.AddTransient<IRequestAck, UpdateGroupChatterAck>();
|
||||
s.AddTransient<IRequestAck, UpdateDefaultTTSVoiceAck>();
|
||||
s.AddTransient<IRequestAck, UpdatePolicyAck>();
|
||||
s.AddTransient<IRequestAck, UpdateRedeemableActionAck>();
|
||||
@@ -196,6 +202,7 @@ s.AddKeyedSingleton<ITwitchSocketHandler, ChannelFollowHandler>("twitch-notifica
|
||||
s.AddKeyedSingleton<ITwitchSocketHandler, ChannelRaidHandler>("twitch-notifications");
|
||||
s.AddKeyedSingleton<ITwitchSocketHandler, ChannelResubscriptionHandler>("twitch-notifications");
|
||||
s.AddKeyedSingleton<ITwitchSocketHandler, ChannelSubscriptionHandler>("twitch-notifications");
|
||||
s.AddKeyedSingleton<ITwitchSocketHandler, ChannelSubscriptionEndHandler>("twitch-notifications");
|
||||
s.AddKeyedSingleton<ITwitchSocketHandler, ChannelSubscriptionGiftHandler>("twitch-notifications");
|
||||
|
||||
// hermes websocket
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using HermesSocketLibrary.Requests.Messages;
|
||||
using TwitchChatTTS.Twitch.Socket.Messages;
|
||||
|
||||
namespace TwitchChatTTS.Twitch.Redemptions
|
||||
{
|
||||
@@ -6,7 +7,7 @@ namespace TwitchChatTTS.Twitch.Redemptions
|
||||
{
|
||||
void Add(RedeemableAction action);
|
||||
void Add(Redemption redemption);
|
||||
Task Execute(RedeemableAction action, string senderDisplayName, long senderId);
|
||||
Task Execute(RedeemableAction action, string senderDisplayName, long senderId, string senderMessage);
|
||||
IEnumerable<RedeemableAction> Get(string twitchRedemptionId);
|
||||
void Initialize();
|
||||
bool RemoveAction(string actionName);
|
||||
|
||||
@@ -166,7 +166,7 @@ namespace TwitchChatTTS.Twitch.Redemptions
|
||||
_logger.Debug($"Added redemption action [redemption id: {item.Id}][twitch redemption id: {twitchRedemptionId}]");
|
||||
}
|
||||
|
||||
public async Task Execute(RedeemableAction action, string senderDisplayName, long senderId)
|
||||
public async Task Execute(RedeemableAction action, string senderDisplayName, long senderId, string senderMessage)
|
||||
{
|
||||
_logger.Debug($"Executing an action for a redemption [action: {action.Name}][action type: {action.Type}][chatter: {senderDisplayName}][chatter id: {senderId}]");
|
||||
|
||||
@@ -190,7 +190,7 @@ namespace TwitchChatTTS.Twitch.Redemptions
|
||||
if (!string.IsNullOrWhiteSpace(directory))
|
||||
Directory.CreateDirectory(directory);
|
||||
|
||||
await File.WriteAllTextAsync(path, ReplaceContentText(action.Data["file_content"], senderDisplayName));
|
||||
await File.WriteAllTextAsync(path, ReplaceContentText(action.Data["file_content"], senderDisplayName, senderId, senderMessage));
|
||||
_logger.Debug($"Overwritten text to file [file: {action.Data["file_path"]}][chatter: {senderDisplayName}][chatter id: {senderId}]");
|
||||
break;
|
||||
}
|
||||
@@ -204,7 +204,7 @@ namespace TwitchChatTTS.Twitch.Redemptions
|
||||
if (!string.IsNullOrWhiteSpace(directory))
|
||||
Directory.CreateDirectory(directory);
|
||||
|
||||
await File.AppendAllTextAsync(path, ReplaceContentText(action.Data["file_content"], senderDisplayName));
|
||||
await File.AppendAllTextAsync(path, ReplaceContentText(action.Data["file_content"], senderDisplayName, senderId, senderMessage));
|
||||
_logger.Debug($"Appended text to file [file: {action.Data["file_path"]}][chatter: {senderDisplayName}][chatter id: {senderId}]");
|
||||
break;
|
||||
}
|
||||
@@ -462,9 +462,14 @@ namespace TwitchChatTTS.Twitch.Redemptions
|
||||
return false;
|
||||
}
|
||||
|
||||
private string ReplaceContentText(string content, string username)
|
||||
private string ReplaceContentText(string content, string chatter, long chatterId, string message)
|
||||
{
|
||||
return content.Replace("%USER%", username)
|
||||
return content.Replace("%USER%", chatter)
|
||||
.Replace("%chatter%", chatter)
|
||||
.Replace("%chatterid%", chatterId.ToString())
|
||||
.Replace("%broadcaster%", _user.TwitchUsername)
|
||||
.Replace("%broadcasterid%", _user.TwitchUserId.ToString())
|
||||
.Replace("%message%", message)
|
||||
.Replace("\\n", "\n");
|
||||
}
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
|
||||
foreach (var action in actions)
|
||||
try
|
||||
{
|
||||
await _redemptionManager.Execute(action, message.RequesterUserLogin, long.Parse(message.RequesterUserId));
|
||||
await _redemptionManager.Execute(action, message.RequesterUserLogin, long.Parse(message.RequesterUserId), string.Empty);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -71,7 +71,7 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
|
||||
foreach (var action in actions)
|
||||
try
|
||||
{
|
||||
await _redemptionManager.Execute(action, message.RequesterUserLogin, long.Parse(message.RequesterUserId));
|
||||
await _redemptionManager.Execute(action, message.RequesterUserLogin, long.Parse(message.RequesterUserId), string.Empty);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Serilog;
|
||||
using TwitchChatTTS.Bus;
|
||||
using TwitchChatTTS.Chat.Commands;
|
||||
using TwitchChatTTS.Chat.Commands.Limits;
|
||||
using TwitchChatTTS.Chat.Groups;
|
||||
@@ -18,6 +19,7 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
|
||||
private readonly IGroupPermissionManager _permissionManager;
|
||||
private readonly IUsagePolicy<long> _permissionPolicy;
|
||||
private readonly IChatterGroupManager _chatterGroupManager;
|
||||
private readonly ServiceBusCentral _bus;
|
||||
private readonly ILogger _logger;
|
||||
|
||||
|
||||
@@ -27,6 +29,7 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
|
||||
IGroupPermissionManager permissionManager,
|
||||
IUsagePolicy<long> permissionPolicy,
|
||||
IChatterGroupManager chatterGroupManager,
|
||||
ServiceBusCentral bus,
|
||||
User user,
|
||||
ILogger logger
|
||||
)
|
||||
@@ -36,12 +39,9 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
|
||||
_commands = commands;
|
||||
_permissionManager = permissionManager;
|
||||
_permissionPolicy = permissionPolicy;
|
||||
|
||||
_chatterGroupManager = chatterGroupManager;
|
||||
_bus = bus;
|
||||
_logger = logger;
|
||||
|
||||
_permissionPolicy.Set("everyone", "tts", 100, TimeSpan.FromSeconds(15));
|
||||
_permissionPolicy.Set("everyone", "tts.chat.messages.read", 3, TimeSpan.FromMilliseconds(15000));
|
||||
}
|
||||
|
||||
|
||||
@@ -58,9 +58,16 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
|
||||
var groups = GetGroups(message.Badges, chatterId);
|
||||
var bits = GetTotalBits(fragments);
|
||||
|
||||
var commandResult = await CheckForChatCommand(message.Message.Text, message, groups);
|
||||
if (commandResult != ChatCommandResult.Unknown)
|
||||
return;
|
||||
if (message.ChannelPointsCustomRewardId == null)
|
||||
{
|
||||
var commandResult = await CheckForChatCommand(message.Message.Text, message, groups);
|
||||
if (commandResult != ChatCommandResult.Unknown)
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
_bus.Send(this, "chat_message_redemption", message);
|
||||
}
|
||||
|
||||
string permission = GetPermissionPath(message.ChannelPointsCustomRewardId, bits);
|
||||
if (!HasPermission(chatterId, groups, permission))
|
||||
@@ -106,7 +113,7 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
|
||||
{
|
||||
var defaultGroups = new string[] { "everyone" };
|
||||
var badgesGroups = badges.Select(b => b.SetId).Select(GetGroupNameByBadgeName);
|
||||
var customGroups = _chatterGroupManager.GetGroupNamesFor(chatterId);
|
||||
var customGroups = _chatterGroupManager.GetGroupNamesFor(chatterId).ToArray();
|
||||
return defaultGroups.Union(badgesGroups).Union(customGroups);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Serilog;
|
||||
using TwitchChatTTS.Bus;
|
||||
using TwitchChatTTS.Twitch.Redemptions;
|
||||
using TwitchChatTTS.Twitch.Socket.Messages;
|
||||
|
||||
@@ -8,16 +9,38 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
|
||||
{
|
||||
public string Name => "channel.channel_points_custom_reward_redemption.add";
|
||||
|
||||
private readonly IDictionary<string, ChannelChatMessage> _messages;
|
||||
private readonly IRedemptionManager _redemptionManager;
|
||||
private readonly ServiceBusCentral _bus;
|
||||
private readonly ILogger _logger;
|
||||
|
||||
public ChannelCustomRedemptionHandler(
|
||||
IRedemptionManager redemptionManager,
|
||||
ServiceBusCentral bus,
|
||||
ILogger logger
|
||||
)
|
||||
{
|
||||
_messages = new Dictionary<string, ChannelChatMessage>();
|
||||
_redemptionManager = redemptionManager;
|
||||
_bus = bus;
|
||||
_logger = logger;
|
||||
|
||||
var topic = _bus.GetTopic("chat_message_redemption");
|
||||
topic.Subscribe((d) =>
|
||||
{
|
||||
var message = d.Value as ChannelChatMessage;
|
||||
|
||||
if (message != null && !string.IsNullOrEmpty(message.ChannelPointsCustomRewardId))
|
||||
{
|
||||
_messages.Add(message.ChannelPointsCustomRewardId, message);
|
||||
|
||||
Task.Run(async () =>
|
||||
{
|
||||
await Task.Delay(TimeSpan.FromMilliseconds(5000));
|
||||
_messages.Remove(message.ChannelPointsCustomRewardId);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public async Task Execute(TwitchWebsocketClient sender, object data)
|
||||
@@ -37,10 +60,32 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
|
||||
}
|
||||
_logger.Debug($"Found {actions.Count()} actions for this Twitch channel point redemption [redeem: {message.Reward.Title}][redeem id: {message.Reward.Id}][transaction: {message.Id}]");
|
||||
|
||||
ChannelChatMessage? chatMessage = null;
|
||||
if (actions.Any(a => a.HasMessage))
|
||||
{
|
||||
if (!_messages.TryGetValue(message.Reward.Id, out chatMessage))
|
||||
{
|
||||
DateTime start = DateTime.Now;
|
||||
_logger.Debug("Waiting on redemption message...");
|
||||
while (DateTime.Now - start < TimeSpan.FromMilliseconds(1000) && !_messages.ContainsKey(message.Reward.Id))
|
||||
await Task.Delay(100);
|
||||
|
||||
if (!_messages.TryGetValue(message.Reward.Id, out chatMessage))
|
||||
{
|
||||
_logger.Warning("Chat message was not found within a second of the channel redemption being received. Skipping all redeemable actions.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (chatMessage != null)
|
||||
_logger.Information($"Linked redemption to chat message [redemption id: {message.Reward.Id}][message id: {chatMessage.MessageId}].");
|
||||
}
|
||||
|
||||
foreach (var action in actions)
|
||||
try
|
||||
{
|
||||
await _redemptionManager.Execute(action, message.UserName, long.Parse(message.UserId));
|
||||
|
||||
await _redemptionManager.Execute(action, message.UserName, long.Parse(message.UserId), message.UserInput);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
|
||||
foreach (var action in actions)
|
||||
try
|
||||
{
|
||||
await _redemptionManager.Execute(action, message.UserName, long.Parse(message.UserId));
|
||||
await _redemptionManager.Execute(action, message.UserName, long.Parse(message.UserId), string.Empty);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
@@ -38,15 +38,15 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
|
||||
var actions = _redemptionManager.Get("subscription");
|
||||
if (!actions.Any())
|
||||
{
|
||||
_logger.Debug($"No redeemable actions for this subscription was found [message: {message.Message.Text}]");
|
||||
_logger.Debug($"No redeemable actions for this subscription was found [chatter id: {message.UserId}][chatter: {message.UserName}][message: {message.Message.Text}]");
|
||||
return;
|
||||
}
|
||||
_logger.Debug($"Found {actions.Count()} actions for this Twitch subscription [message: {message.Message.Text}]");
|
||||
_logger.Debug($"Found {actions.Count()} actions for this Twitch subscription [chatter id: {message.UserId}][chatter: {message.UserName}][message: {message.Message.Text}]");
|
||||
|
||||
foreach (var action in actions)
|
||||
try
|
||||
{
|
||||
await _redemptionManager.Execute(action, message.UserName!, long.Parse(message.UserId!));
|
||||
await _redemptionManager.Execute(action, message.UserName!, long.Parse(message.UserId!), message.Message.Text);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
52
Twitch/Socket/Handlers/ChannelSubscriptionEndHandler.cs
Normal file
52
Twitch/Socket/Handlers/ChannelSubscriptionEndHandler.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
using Serilog;
|
||||
using TwitchChatTTS.Twitch.Redemptions;
|
||||
using TwitchChatTTS.Twitch.Socket.Messages;
|
||||
|
||||
namespace TwitchChatTTS.Twitch.Socket.Handlers
|
||||
{
|
||||
public class ChannelSubscriptionEndHandler : ITwitchSocketHandler
|
||||
{
|
||||
public string Name => "channel.subscription.end";
|
||||
|
||||
private readonly IRedemptionManager _redemptionManager;
|
||||
private readonly ILogger _logger;
|
||||
|
||||
public ChannelSubscriptionEndHandler(IRedemptionManager redemptionManager, ILogger logger)
|
||||
{
|
||||
_redemptionManager = redemptionManager;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task Execute(TwitchWebsocketClient sender, object data)
|
||||
{
|
||||
if (data is not ChannelSubscriptionEndMessage message)
|
||||
return;
|
||||
|
||||
_logger.Information($"Subscription ended [chatter: {message.UserLogin}][chatter id: {message.UserId}][Tier: {message.Tier}]");
|
||||
try
|
||||
{
|
||||
var actions = _redemptionManager.Get("subscription.end");
|
||||
if (!actions.Any())
|
||||
{
|
||||
_logger.Debug($"No redeemable actions for this subscription was found [subscriber: {message.UserLogin}][subscriber id: {message.UserId}]");
|
||||
return;
|
||||
}
|
||||
_logger.Debug($"Found {actions.Count()} actions for this Twitch subscription [subscriber: {message.UserLogin}][subscriber id: {message.UserId}]");
|
||||
|
||||
foreach (var action in actions)
|
||||
try
|
||||
{
|
||||
await _redemptionManager.Execute(action, message.UserName!, long.Parse(message.UserId!), string.Empty);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Error(ex, $"Failed to execute redeemable action [action: {action.Name}][action type: {action.Type}][redeem: subscription][subscriber: {message.UserLogin}][subscriber id: {message.UserId}]");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Error(ex, $"Failed to fetch the redeemable actions for subscription [subscriber: {message.UserLogin}][subscriber id: {message.UserId}]");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -40,7 +40,7 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
|
||||
foreach (var action in actions)
|
||||
try
|
||||
{
|
||||
await _redemptionManager.Execute(action, message.UserName ?? "Anonymous", message.UserId == null ? 0 : long.Parse(message.UserId));
|
||||
await _redemptionManager.Execute(action, message.UserName ?? "Anonymous", message.UserId == null ? 0 : long.Parse(message.UserId), string.Empty);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
|
||||
foreach (var action in actions)
|
||||
try
|
||||
{
|
||||
await _redemptionManager.Execute(action, message.UserName!, long.Parse(message.UserId!));
|
||||
await _redemptionManager.Execute(action, message.UserName!, long.Parse(message.UserId!), string.Empty);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
@@ -37,11 +37,12 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
|
||||
_messageTypes.Add("channel.chat.clear_user_messages", typeof(ChannelChatClearUserMessage));
|
||||
_messageTypes.Add("channel.chat.message_delete", typeof(ChannelChatDeleteMessage));
|
||||
_messageTypes.Add("channel.channel_points_custom_reward_redemption.add", typeof(ChannelCustomRedemptionMessage));
|
||||
_messageTypes.Add("channel.raid", typeof(ChannelRaidMessage));
|
||||
_messageTypes.Add("channel.follow", typeof(ChannelFollowMessage));
|
||||
_messageTypes.Add("channel.raid", typeof(ChannelRaidMessage));
|
||||
_messageTypes.Add("channel.subscribe", typeof(ChannelSubscriptionMessage));
|
||||
_messageTypes.Add("channel.subscription.message", typeof(ChannelResubscriptionMessage));
|
||||
_messageTypes.Add("channel.subscription.end", typeof(ChannelSubscriptionEndMessage));
|
||||
_messageTypes.Add("channel.subscription.gift", typeof(ChannelSubscriptionGiftMessage));
|
||||
_messageTypes.Add("channel.subscription.message", typeof(ChannelResubscriptionMessage));
|
||||
}
|
||||
|
||||
public Task Execute(TwitchWebsocketClient sender, object data)
|
||||
|
||||
@@ -61,6 +61,7 @@ namespace TwitchChatTTS.Twitch.Socket.Handlers
|
||||
"channel.chat.clear",
|
||||
"channel.chat.clear_user_messages",
|
||||
"channel.subscribe",
|
||||
"channel.subscription.end",
|
||||
"channel.subscription.gift",
|
||||
"channel.subscription.message",
|
||||
"channel.ad_break.begin",
|
||||
|
||||
@@ -15,6 +15,12 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
|
||||
public TwitchReplyInfo? Reply { get; set; }
|
||||
public string? ChannelPointsCustomRewardId { get; set; }
|
||||
public string? ChannelPointsAnimationId { get; set; }
|
||||
public string? SourceBroadcasterUserId { get; set; }
|
||||
public string? SourceBroadcasterUserName { get; set; }
|
||||
public string? SourceBroadcasterUserLogin { get; set; }
|
||||
public string? SourceMessageId { get; set; }
|
||||
public TwitchBadge[]? SourceBadges { get; set; }
|
||||
|
||||
}
|
||||
|
||||
public class TwitchChatMessageInfo
|
||||
|
||||
@@ -9,6 +9,7 @@ namespace TwitchChatTTS.Twitch.Socket.Messages
|
||||
public required string UserId { get; set; }
|
||||
public required string UserLogin { get; set; }
|
||||
public required string UserName { get; set; }
|
||||
public required string UserInput { get; set; }
|
||||
public required string Status { get; set; }
|
||||
public DateTime RedeemedAt { get; set; }
|
||||
public required RedemptionReward Reward { get; set; }
|
||||
|
||||
7
Twitch/Socket/Messages/ChannelSubscriptionEndMessage.cs
Normal file
7
Twitch/Socket/Messages/ChannelSubscriptionEndMessage.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace TwitchChatTTS.Twitch.Socket.Messages
|
||||
{
|
||||
public class ChannelSubscriptionEndMessage : ChannelSubscriptionData
|
||||
{
|
||||
public bool IsGift { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -9,21 +9,21 @@
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="6.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.1" />
|
||||
<PackageReference Include="NAudio" Version="2.2.1" />
|
||||
<PackageReference Include="NAudio.Extras" Version="2.2.1" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="Serilog" Version="4.0.0" />
|
||||
<PackageReference Include="Serilog.AspNetCore" Version="8.0.2-dev-00338" />
|
||||
<PackageReference Include="Serilog" Version="4.2.0" />
|
||||
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
|
||||
<PackageReference Include="Serilog.Formatting.Compact" Version="3.0.0" />
|
||||
<PackageReference Include="Serilog.Settings.Configuration" Version="8.0.2" />
|
||||
<PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" />
|
||||
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
|
||||
<PackageReference Include="Serilog.Sinks.Debug" Version="3.0.0" />
|
||||
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
|
||||
<PackageReference Include="System.Reactive" Version="6.0.1" />
|
||||
<PackageReference Include="System.Text.Json" Version="8.0.4" />
|
||||
<PackageReference Include="System.Text.Json" Version="9.0.1" />
|
||||
<PackageReference Include="NAudio.Core" Version="2.2.1" />
|
||||
<PackageReference Include="YamlDotNet" Version="16.0.0" />
|
||||
<PackageReference Include="YamlDotNet" Version="16.3.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
Reference in New Issue
Block a user