public override void Execute(IEnumerable <String> arguments) { if (!arguments.Any()) { base.Execute(arguments); return; } if (!Int32.TryParse(arguments.First(), out Int32 height)) { Writer.WriteLine($"Pyramid height of \"{arguments.First()}\" must be an integer"); return; } IEnumerable <String> pyramidBlockArguments = arguments.Skip(1); if (!pyramidBlockArguments.Any()) { Writer.WriteLine("Pyramid block not supplied."); return; } String pyramidBlock = String.Join(' ', pyramidBlockArguments); var pyramid = PyramidBuilder.Get(pyramidBlock, height); foreach (var line in pyramid) { TwitchClientManager.SpoolMessage(line); } }
public void Client_OnMessageReceived(Object sender, OnMessageReceivedArgs e) { if (UsersToPogO.Contains(e.ChatMessage.Username)) { TwitchClientManager.SpoolMessage($"@{e.ChatMessage.DisplayName} PogO"); } }
public override void Execute(IEnumerable <String> arguments) { Char userTypeString = arguments.FirstOrDefault()?.ToLower()[0] ?? default; var userType = userTypeString switch { 'm' => UserType.Moderator, 'v' => UserType.VIP, _ => UserType.Viewer, }; // Remove user type parameter from message. if (userType != UserType.Viewer) { arguments = arguments.Skip(1); } var chatters = Api .Undocumented .GetChattersAsync(TwitchClientManager.PrimaryChannelName) .Result .Where(user => user.UserType >= userType); var message = " " + String.Join(' ', arguments); foreach (var user in chatters) { TwitchClientManager.SpoolMessage(TwitchClientManager.PrimaryChannelName, user.Username + message); } ; }
private void TwitchClient_OnMessageReceived(Object sender, OnMessageReceivedArgs e) { if (e.ChatMessage.Channel != ListenChannel) { return; } if (e.ChatMessage.Username != ListenUsername) { return; } String translatedText = NodeService.InvokeFromStringAsync <String>( moduleString: JavaScript.Translate, args: e.ChatMessage.Message.Split(' ').ToArray()).Result; if (translatedText != null) { if (translatedText == e.ChatMessage.Message) { TwitchClientManager.SpoolMessage($"TearChub New {ListenUsername} message in {ListenChannel}'s chat!"); TwitchClientManager.SpoolMessage("Message: " + e.ChatMessage.Message); } else { TwitchClientManager.SpoolMessage($"TearChub New non-english {ListenUsername} message in {ListenChannel}'s chat!"); TwitchClientManager.SpoolMessage("Original message: " + e.ChatMessage.Message); TwitchClientManager.SpoolMessage("Translated message: " + translatedText); String replacedMessage = e.ChatMessage.Message.Replace(" ", "%20"); TwitchClientManager.SpoolMessage("View on google translate: https://translate.google.com/?um=1&ie=UTF-8&hl=en&client=tw-ob#view=home&op=translate&sl=zh-CN&tl=en&text=" + replacedMessage); } } }
/// <summary> /// Notify when a pyramid has been broken. /// </summary> private void SpoolPyramidFailedMessage(String userThatBrokePyramid) { // Only send message on relavant pyramids to avoid false positives. if (Pyramid.TallestHeight < MinimumRelevantPyramidHeight) { return; } if (Pyramid.ContributorDisplayNames.Contains(userThatBrokePyramid)) { if (Pyramid.ContributorDisplayNames.Count == 1) { // User broke their own pyramid. TwitchClientManager.SpoolMessage($"@{userThatBrokePyramid} You just ruined your own {Pyramid.TallestHeight}-story tall {Pyramid.Block} pyramid. Sadge"); } else { // User broke co-operative pyramid. TwitchClientManager.SpoolMessage($"@{userThatBrokePyramid} Imagine working with @{String.Join(", @", Pyramid.ContributorDisplayNames.Where(name => !name.Equals(userThatBrokePyramid, StringComparison.OrdinalIgnoreCase)))} to build a {Pyramid.TallestHeight}-story tall {Pyramid.Block} pyramid and then ruining it. 4WeirdW"); } } else { // User broke someone else's pyramid. TwitchClientManager.SpoolMessage($"@{userThatBrokePyramid} Nice job ruining the {Pyramid.TallestHeight}-story {Pyramid.Block} tall pyramid built by @{String.Join(", @", Pyramid.ContributorDisplayNames)}. PogO"); } }
public override void Invoke(Object sender, OnUserCommandReceivedArgs e) { switch (e.Words.Length) { case 0: TwitchClientManager.SpoolMessage(e.ChatMessage.Channel, $"{e.ChatMessage.DisplayName} {GetRandom(0, 100)}"); break; case 1: TwitchClientManager.SpoolMessage( e.ChatMessage.Channel, $"{e.ChatMessage.DisplayName} You must include a minimum and maximum integer", Priority.Low); break; default: if (!Int32.TryParse(e.Words[0], out Int32 min) || !Int32.TryParse(e.Words[1], out Int32 max)) { TwitchClientManager.SpoolMessage( e.ChatMessage.Channel, $"The minimum and maximum values must be integers", Priority.Low); break; } TwitchClientManager.SpoolMessage(e.ChatMessage.Channel, $"{e.ChatMessage.DisplayName} {GetRandom(min, max)}"); break; } }
public async override void Invoke(Object sender, OnUserCommandReceivedArgs e) { if (!e.Words.Any() || !e.Words.First().Equals(e.ChatMessage.Username, StringComparison.OrdinalIgnoreCase)) { TwitchClientManager.SpoolMessageAsMe(e.ChatMessage.Channel, $"{e.ChatMessage.DisplayName} I cannot join other users' channels for you."); return; } using var context = ContextFactory.GetContext(); // Users can only add their own channel var channelFound = context.StartupChannels.FirstOrDefault(x => x.UserID == e.ChatMessage.UserId); String outputMessage; if (channelFound == null) { if (context.StartupChannels.Count() >= MaximumChannelsToJoin) { outputMessage = $"{e.ChatMessage.DisplayName} I have reached the maximum number of channels to join and could not join your channel."; } else { // Add new channel. context.StartupChannels.Add(new StartupChannel() { UserID = e.ChatMessage.UserId, DisplayName = e.ChatMessage.DisplayName }); outputMessage = $"{e.ChatMessage.DisplayName} I have now joined your channel."; } } else { // Update the display name channelFound.DisplayName = e.ChatMessage.DisplayName; if (channelFound.DisplayName == e.ChatMessage.DisplayName) { outputMessage = $"{e.ChatMessage.DisplayName} I have already joined your channel."; } else { outputMessage = $"{e.ChatMessage.DisplayName} I have already joined your channel. Updated user name."; } // Update the display name channelFound.DisplayName = e.ChatMessage.DisplayName; } var task = context.SaveChangesAsync(); TwitchClientManager.Client.JoinChannel(e.ChatMessage.Username); TwitchClientManager.SpoolMessageAsMe(e.ChatMessage.Channel, outputMessage); await task; }
public async override void Invoke(Object sender, OnUserCommandReceivedArgs e) { if (!e.Words.Any() || !e.Words.First().Equals(e.ChatMessage.Username, StringComparison.OrdinalIgnoreCase)) { TwitchClientManager.SpoolMessageAsMe(e.ChatMessage.Channel, $"{e.ChatMessage.DisplayName} I cannot leave other users' channels for you."); return; } var context = ContextFactory.GetContext(); // Users can only leave their own channel. var channelFound = context.StartupChannels.FirstOrDefault(x => x.UserID == e.ChatMessage.UserId); Task <Int32> task = null; if (channelFound is not null) { context.StartupChannels.Remove(channelFound); task = context.SaveChangesAsync(); } TwitchClientManager.Client.LeaveChannel(e.ChatMessage.Username); TwitchClientManager.SpoolMessageAsMe(e.ChatMessage.Channel, $"{e.ChatMessage.DisplayName} I have left your channel"); if (task is not null) { await task; } }
/// <summary>Dank memes are cool</summary> /// <example></example> /// <param name="arguments"></param> public override void Execute(IEnumerable <String> arguments) { String surroundingEmote = arguments.FirstOrDefault() ?? "yyjW"; TwitchClientManager.SpoolMessage($"{surroundingEmote} {surroundingEmote} {surroundingEmote} {surroundingEmote}"); TwitchClientManager.SpoolMessage($"{surroundingEmote} yyj1 yyj2 {surroundingEmote}"); TwitchClientManager.SpoolMessage($"{surroundingEmote} yyj3 yyj4 {surroundingEmote}"); TwitchClientManager.SpoolMessage($"{surroundingEmote} {surroundingEmote} {surroundingEmote} {surroundingEmote}"); }
public override void Invoke(Object sender, OnUserCommandReceivedArgs e) { String translatedText = NodeService.InvokeFromStringAsync <String>(moduleString: JavaScript.Translate, args: e.Words).Result; if (translatedText is not null) { TwitchClientManager.SpoolMessage(translatedText); } }
private void TwitchClient_OnUserJoined(Object sender, OnUserJoinedArgs e) { // Don't count self if (e.Username.Equals(TwitchClientManager.Name.Value, StringComparison.OrdinalIgnoreCase)) { return; } TwitchClientManager.SpoolMessage($"@{e.Username} {Greeting} {(CurrentMode == Mode.Wholesome ? Compliments.GetCompliment() : String.Empty)}"); }
private void SpoolSuccessMessage() { if (Contributors.Count == 1) { TwitchClientManager.SpoolMessage($"@{Contributors.Single()} Nice {Border} jimbox! peepoClap"); } else { TwitchClientManager.SpoolMessage($"@{String.Join(", @", Contributors)} Nice {Border} jimbox! Hooray teamwork! peepoClap"); } }
private void SpoolPyramidSuccessMessage() { if (Pyramid.ContributorDisplayNames.Count == 1) { TwitchClientManager.SpoolMessage($"@{Pyramid.ContributorDisplayNames.Single()} Nice {Pyramid.TallestHeight}-story tall {Pyramid.Block} pyramid! peepoClap"); } else { TwitchClientManager.SpoolMessage($"@{String.Join(", @", Pyramid.ContributorDisplayNames)} Nice {Pyramid.TallestHeight}-story tall {Pyramid.Block} pyramid! Hooray teamwork! peepoClap"); } }
public override void Execute(IEnumerable <String> arguments) { base.Execute(arguments); if (IsEnabled) { TwitchClientManager.EnsureJoinedToChannel(Channel); } Repeater.IsRunning = IsEnabled; }
private void Client_OnMessageReceived(Object sender, OnMessageReceivedArgs e) { if (ShouldIgnore(e.ChatMessage)) { PreviousMessages.Enqueue(null); } else if (OnCooldown) { MessageCooldownTracker++; if (MessageCooldownTracker > MessageCooldownCount) { OnCooldown = false; MessageCooldownTracker = 0; } } else { PreviousMessages.Enqueue(e.ChatMessage.Message); } if (PreviousMessages.Count >= MessageSampleCount) { // Get the most common message from the last GeneralMessageCount // number of messages, as long as there is more than one // duplicate of it. if (TryGetMessageToSend(out String message)) { TwitchClientManager.SpoolMessage(message); OnCooldown = true; } // Empty the last messages, whether one was sent or not to // avoid copying old messages. PreviousMessages.Clear(); } else if (SpamMessageSampleCounts.Any(count => PreviousMessages.Count >= count)) { // Get the most common message from the last SpamMessageCount // number of messages, as long as there is more than one // duplicate of it. if (TryGetMessageToSend(out String message)) { TwitchClientManager.SpoolMessage(message); // Empty the last messages, if one was sent. PreviousMessages.Clear(); OnCooldown = true; } } }
public override void Invoke(Object sender, OnUserCommandReceivedArgs e) { if (e.Words.Length < 2) { TwitchClientManager.SpoolMessage(e.ChatMessage.DisplayName + " Usage: !pyramid <size> <text>", Priority.Low); return; } if (!Int32.TryParse(e.Words[0], out Int32 height) || height < 1) { TwitchClientManager.SpoolMessage($"{e.ChatMessage.DisplayName} Pyramid height of \"{e.Words[0]}\" must be a positive integer"); } IEnumerable <String> pyramidBlockArguments = e.Words[1..];
public override void Invoke(Object sender, OnUserCommandReceivedArgs e) { var request = String.Join(' ', e.Words); var result = WolframAlpha.Query(request); if (result.Success) { var pod = result.Pods.FirstOrDefault(pod => pod.Title == "Result" || pod.Title == "Wikipedia summary"); if (pod != null && pod.SubPods != null) { StringBuilder messageBuilder = new(); messageBuilder.Append(e.ChatMessage.DisplayName); messageBuilder.Append(' '); if (pod.Title == "Result") { foreach (var subpod in pod.SubPods) { messageBuilder.Append(subpod.Plaintext); } } else { StringBuilder wikipediaEntryBuilder = new(); foreach (var subpod in pod.SubPods) { wikipediaEntryBuilder.Append(subpod.Plaintext); wikipediaEntryBuilder.Append(' '); } var match = FirstSentenceRegex.Match(wikipediaEntryBuilder.ToString()); if (match.Success) { messageBuilder.Append(match.Value); } } TwitchClientManager.SpoolMessage(messageBuilder.ToString()); } } else { TwitchClientManager.SpoolMessage(e.ChatMessage.DisplayName + " Could not query WolframAlpha successfully."); } }
public override void Execute(IEnumerable <String> arguments) { if (!arguments.Any()) { Console.WriteLine(GetHelp()); return; } var permutations = arguments.First().GetPermutations(); foreach (var permutation in permutations) { TwitchClientManager.SpoolMessage(permutation); } }
protected UsingTwitchClientManager() { TwitchUsername = Guid.NewGuid().ToString(); TwitchOAuth = Guid.NewGuid().ToString(); PrimaryChannelName = Name.From("p"); MockedBot = new(); MockedApplicationContextFactory = new(); MockedApplicationContext = new(); MockedTwitchClientFactory = new(); MockedTwitchClient = new(); MockedCredentialsManager = new(); MockedSpinWait = new(); MockedThreadService = new(); MockedDateTimeService = new(); ApplicationCredentials = new(); ConnectionCredentials = new(TwitchUsername, TwitchOAuth, disableUsernameCheck : true); LoginCredentials = new(ConnectionCredentials, true, PrimaryChannelName); MockedWriter = new(); Sut = new TwitchClientManager( MockedApplicationContextFactory.Object, MockedTwitchClientFactory.Object, MockedCredentialsManager.Object, MockedSpinWait.Object, MockedThreadService.Object, MockedDateTimeService.Object, MockedWriter.Object); MockedTwitchClientFactory .Setup(x => x.CreateClient(It.IsAny <IClientOptions>())) .Returns(MockedTwitchClient.Object); var credentials = LoginCredentials; MockedCredentialsManager .Setup(x => x.TryUpdateLoginCredentials(It.IsAny <LoginCredentials>(), out credentials)) .Returns(true); MockedCredentialsManager .Setup(x => x.ApplicationCredentials) .Returns(ApplicationCredentials); MockedApplicationContextFactory .Setup(x => x.GetContext()) .Returns(MockedApplicationContext.Object); }
public LoginCredentials Initialize(LoginCredentials credentials) { credentials = TwitchClientManager.TryInitializeTwitchClient(this, credentials: credentials); if (credentials == null) { return(null); } if (!TwitchClientManager.TryJoinInitialChannels()) { return(null); } return(credentials); }
public LoginCredentials Start( IClientOptions clientOptions = null, LoginCredentials credentials = null) { IReadOnlyList <JoinedChannel> previouslyJoinedChannels = TwitchClientManager.Client?.JoinedChannels; LoginCredentials = TwitchClientManager.TryInitializeTwitchClient(this, clientOptions, credentials); if (LoginCredentials is not null && TwitchClientManager.TryJoinInitialChannels(previouslyJoinedChannels)) { Commands.Configure(LoginCredentials); return(LoginCredentials); } return(null); }
public override void Execute(IEnumerable <String> arguments) { if (!arguments.Any()) { return; } if (!TwitchClientManager.Client.IsConnected) { TwitchClientManager.Client.Connect(); } String channelName = arguments.FirstOrDefault(); // If the user inputs any second argument, it will join that channel and not leave the existing channel. TwitchClientManager.EnsureJoinedToChannel(channelName); }
private void TwitchClient_OnMessageReceived(Object sender, OnMessageReceivedArgs e) { if (UsersToReplyTo.Any() && !UsersToReplyTo.Contains(e.ChatMessage.Username)) { return; } if (!Comparator.Matches(e.ChatMessage.Message, TriggerMessage)) { return; } String replyMessage = String.IsNullOrWhiteSpace(ReplyMessage) ? TriggerMessage : ReplyMessage; String replyMessageWithUserName = replyMessage.Replace("@", $"@{e.ChatMessage.DisplayName}"); TwitchClientManager.SpoolMessage(replyMessageWithUserName); }
private void TwitchClient_OnMessageReceived(Object sender, OnMessageReceivedArgs e) { if (!e.ChatMessage.Username.Equals(UserToMirror, StringComparison.OrdinalIgnoreCase)) { return; } String replacedUsernameMessage = // Modify message to mentions of bot username become the username // of the one copied. e.ChatMessage.Username.Equals("streamelements", StringComparison.OrdinalIgnoreCase) ? e.ChatMessage.Message : e.ChatMessage.Message.Replace(e.ChatMessage.BotUsername, e.ChatMessage.Username, StringComparison.OrdinalIgnoreCase); String modeModifiedMessage = String.Empty; switch (Mode) { case CopyMode.Default: modeModifiedMessage = replacedUsernameMessage; break; case CopyMode.Mock: modeModifiedMessage = "" + replacedUsernameMessage.ToRandomCase(); break; case CopyMode.Reverse: modeModifiedMessage = String.Join(String.Empty, replacedUsernameMessage.Reverse()); break; } String prefixAddedMessage = (String.IsNullOrWhiteSpace(MessagePrefix) ? String.Empty : MessagePrefix + " ") + modeModifiedMessage; // Shorten message to abide by message length limit (for non-VIPs). const Int32 messageCharacterLimit = 300; String truncatedMessage = prefixAddedMessage.Substring(0, Math.Min(prefixAddedMessage.Length, messageCharacterLimit)); TwitchClientManager.SpoolMessage(truncatedMessage); }
private void SpoolRepeatMessages() { Responded = false; while (!Responded) { TwitchClientManager.SpoolMessage(Channel, "!cookie"); SpinWait.SpinUntil(() => Responded, TimeSpan.FromSeconds(5)); } Responded = false; while (!Responded) { TwitchClientManager.SpoolMessage(Channel, "!cdr"); SpinWait.SpinUntil(() => Responded, TimeSpan.FromSeconds(5)); } Responded = false; while (!Responded) { TwitchClientManager.SpoolMessage(Channel, "!cookie"); SpinWait.SpinUntil(() => Responded, TimeSpan.FromSeconds(5)); } LastCookieTime = DateTime.Now; }
public override void Execute(IEnumerable <String> arguments) { if (!arguments.Any()) { return; } if (!TwitchClientManager.Client.IsConnected) { TwitchClientManager.Client.Connect(); } String channelName = arguments.First(); var joinedChannels = TwitchClientManager.Client.JoinedChannels; foreach (var channel in joinedChannels) { TwitchClientManager.Client.LeaveChannel(channel); } TwitchClientManager.EnsureJoinedToChannel(channelName); }
public override void Invoke(Object sender, OnUserCommandReceivedArgs e) { if (!e.Words.TryGetFirst(out var keyword, out var next)) { return; } // TODO add channel admins if (!e.ChatMessage.Username.Equals("chubbehmouse", StringComparison.OrdinalIgnoreCase) && !e.ChatMessage.Username.Equals(e.ChatMessage.Channel, StringComparison.OrdinalIgnoreCase)) { return; } switch (keyword.ToLower()) { case "a": case "add": { if (next.TryGetFirst(out var categoryString, out var next2) && categoryString.TryParseEnum(out EmoteCategory category)) { // Filter out single character words, such as chatterino message duplicate characters. var emotes = next2.Where(x => x.Length >= 2); var results = EmoteManager.AddAll(emotes, category, e.ChatMessage.Channel); StringBuilder builder = new StringBuilder() .Append(e.ChatMessage.DisplayName) .Append(','); if (results.Succeeded.Any()) { builder .Append(" Added ") .Append(category) .Append(" emotes: ") .Append(String.Join(' ', results.Succeeded)); } if (results.Failed.Any()) { builder .Append(" Failed to add ") .Append(category) .Append(" emotes: ") .Append(String.Join(' ', results.Failed)); } TwitchClientManager.SpoolMessage(e.ChatMessage.Channel, builder.ToString()); } } break; case "d": case "delete": case "remove": { if (next.TryGetFirst(out var categoryString, out var next2) && categoryString.TryParseEnum(out EmoteCategory category)) { var emotes = next2.Where(x => x.Length > 1); var results = EmoteManager.RemoveAll(emotes, category, e.ChatMessage.Channel); StringBuilder builder = new StringBuilder() .Append(e.ChatMessage.DisplayName) .Append(','); if (results.Succeeded.Any()) { builder .Append(" Removed ") .Append(category) .Append(" emotes: ") .Append(String.Join(' ', results.Succeeded)); } if (results.Failed.Any()) { builder .Append(" Failed to remove ") .Append(category) .Append(" emotes: ") .Append(String.Join(' ', results.Failed)); } TwitchClientManager.SpoolMessage(e.ChatMessage.Channel, builder.ToString()); } } break; default: { if (keyword.TryParseEnum(out EmoteCategory category) && category != EmoteCategory.Invalid) { var emotes = EmoteManager.Get(e.ChatMessage.Channel, category); StringBuilder builder = new StringBuilder() .Append(e.ChatMessage.DisplayName) .Append(", ") .Append(category) .Append(" emotes: ") .Append(String.Join(' ', emotes)); TwitchClientManager.SpoolMessage(e.ChatMessage.Channel, builder.ToString()); } } break; } }
private void ChangeColor() { CurrentColor = CurrentSelector.GetNextColor(); TwitchClientManager.SpoolMessage($".color {CurrentColor}"); }
public void TwitchClient_OnUserTimedout(Object sender, OnUserTimedoutArgs e) { TwitchClientManager.SpoolMessage($"WideHardo FREE MY MAN {e.UserTimeout.Username.ToUpper()}"); }
private void SpoolCount() { TwitchClientManager.SpoolMessage($"{Prefix} {CurrentCount++} {Suffix}"); }