public void HandleItemLookup(ICommandContext context, [Parameter("Item name to lookup.")] string name, [Parameter("Maximum amount of results to return.")] int?maxResults) { List <Item2Entry> searchResults = SearchManager.Instance .Search <Item2Entry>(name, context.Language, e => e.LocalizedTextIdName, true) .Take(maxResults ?? 25) .ToList(); if (searchResults.Count == 0) { context.SendMessage($"Item lookup results was 0 entries for '{name}'."); return; } context.SendMessage($"Item lookup results for '{name}' ({searchResults.Count}):"); var target = context.GetTargetOrInvoker <Player>(); foreach (Item2Entry itemEntry in searchResults) { var builder = new ChatMessageBuilder { Type = ChatChannelType.System, Text = $"({itemEntry.Id}) " }; builder.AppendItem(itemEntry.Id); target.Session.EnqueueMessageEncrypted(builder.Build()); } }
public void FakeRaiseMessage(string message, string channelName = null, string username = null) { if (channelName == null) { channelName = "fakeChannelName"; } if (username == null) { username = "******"; } var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername(username) .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithChannel(channelName) .WithMessage(message) .Build(); var handler = OnMessageReceived; if (handler == null) { throw new Exception("In FakeRaiseMessage: No handler has been defined."); } handler.Invoke(this, new OnMessageReceivedArgs { ChatMessage = chatMessage }); }
[TestCase(true, 0)] // if marker document does exist, don't create/update it public async Task Create_recent_activity_marker_document_if_necessary(bool documentAlreadyExists, int timesCalled) { // arrange var username = "******"; _mockBucket.Setup(x => x.ExistsAsync($"{username}::arrived_recently")) .ReturnsAsync(documentAlreadyExists); var twitchLibMessage = TwitchLibMessageBuilder.Create().WithUsername(username).Build(); var chatMessage = ChatMessageBuilder.Create().WithTwitchLibMessage(twitchLibMessage).Build(); var request = new UserHasArrived(chatMessage); _mockBucket.Setup(x => x.GetAsync <TwitcherProfile>(It.IsAny <string>())) .ReturnsAsync(new FakeOperationResult <TwitcherProfile> { Value = new TwitcherProfile() }); _mockTwitchHub.Setup(x => x.ReceiveFanfare(It.IsAny <FanfareInfo>())); // act await _handler.Handle(request, CancellationToken.None); // assert _mockBucket.Verify(x => x.UpsertAsync( It.Is <Document <dynamic> >(x => x.Id == $"{username}::arrived_recently" && x.Expiry == 12 * 60 * 60 * 1000 // 12 hours ) ), Times.Exactly(timesCalled)); }
public async Task No_fanfare_if_there_is_no_user_profile() { // arrange var username = "******"; var twitchLibMessage = TwitchLibMessageBuilder.Create().WithUsername(username).Build(); var chatMessage = ChatMessageBuilder.Create().WithTwitchLibMessage(twitchLibMessage).Build(); var request = new UserHasArrived(chatMessage); // setup: user has NOT arrive recently _mockBucket.Setup(m => m.ExistsAsync($"{username}::arrived_recently")) .ReturnsAsync(false); // setup: don't care about the arrive_recently document being added _mockBucket.Setup(m => m.UpsertAsync(It.IsAny <Document <dynamic> >())); // setup: user does NOT have a profile _mockBucket.Setup(m => m.GetAsync <TwitcherProfile>(username.ToLower())) .ReturnsAsync(new FakeOperationResult <TwitcherProfile> { Value = null }); // act await _handler.Handle(request, CancellationToken.None); // assert _mockTwitchHub.Verify(m => m.ReceiveFanfare(It.IsAny <FanfareInfo>()), Times.Never); }
public async Task Should_insert_message_into_bucket() { // arrange var expectedUsername = "******" + Guid.NewGuid(); var expectedMessage = "some message whatever " + Guid.NewGuid(); var expectedChannel = "mychannel" + Guid.NewGuid(); var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername(expectedUsername) .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage(expectedMessage) .WithChannel(expectedChannel) .Build(); var request = new StoreMessage(chatMessage); // act await _handler.Handle(request, CancellationToken.None); // assert _mockBucket.Verify(x => x.InsertAsync(It.Is <Document <ChatMessage> >(d => d.Id != Guid.Empty.ToString())), Times.Once()); _mockBucket.Verify(x => x.InsertAsync(It.Is <Document <ChatMessage> >(d => d.Content.Username == expectedUsername)), Times.Once()); _mockBucket.Verify(x => x.InsertAsync(It.Is <Document <ChatMessage> >(d => d.Content.Message == expectedMessage)), Times.Once()); _mockBucket.Verify(x => x.InsertAsync(It.Is <Document <ChatMessage> >(d => d.Content.Channel == expectedChannel)), Times.Once()); }
public async Task Show_current_project_url() { // arrange var expectedUrl = "http://example.org/foo/bar"; var expectedMessage = $"Current Project is: " + expectedUrl; var projectInfo = new CurrentProjectInfo { Url = new Uri(expectedUrl) }; var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("doesntmatterusername") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage("!currentproject") .WithChannel("doesntmatterchannel") .Build(); var request = new SayCurrentProject(chatMessage); _mockBucket.Setup(x => x.Get <CurrentProjectInfo>("currentProject")) .Returns(new FakeOperationResult <CurrentProjectInfo> { Success = true, Value = projectInfo }); // act await _handler.Handle(request, CancellationToken.None); // assert _mockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), expectedMessage, false), Times.Once); }
public async Task ShoutOut_will_shout_the_given_username() { // arrange var userName = "******"; var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("doesntmatter") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithIsSubscriber(true) .WithMessage($"!so {userName}") .Build(); MockApiWrapper.Setup(x => x.DoesUserExist(userName)).ReturnsAsync(true); MockCollection.Setup(x => x.ExistsAsync(userName.ToLower(), null)) .ReturnsAsync(new FakeExistsResult(true)); MockCollection.Setup(x => x.GetAsync(userName.ToLower(), null)) .ReturnsAsync(new FakeGetResult(new TwitcherProfile())); var shout = new ShoutOut(chatMessage); var expectedMessage = $"Hey everyone, check out @{userName}'s Twitch stream at https://twitch.tv/{userName}"; // act await _handler.Handle(shout, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), expectedMessage, false), Times.Once); }
/// <summary> /// 标记消息为已读 /// </summary> /// <param name="message">消息</param> /// <returns>结果</returns> public async Task <bool> NoteRead(ChatMessage message) { //判断消息是否位于消息列表中 if (!instance.MessageList.Contains(message)) { //消息不存在返回假 return(false); } //调用消息控制器标记消息为已读 MessageController messageController = new MessageController(db.Messages); messageController.SetMessage(message); messageController.NoteRead(); //向服务器发送已读消息请求 client.NoteMessage(instance, message); //更新话题时间戳 instance.Read = message.SeqId; instance.LastUsed = ChatMessageBuilder.GetTimeStamp(); var dbContext = db.Topics.GetRepository(); await dbContext.UpsertTopic(instance); //标记成功返回真 return(true); }
public async Task ShoutOut_WILL_shout_if_the_given_username_is_a_real_twitch_user() { // arrange var userLookup = "doesntmattereither"; var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("doesntmatter") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithIsSubscriber(true) .WithMessage($"!so {userLookup}") .Build(); MockApiWrapper.Setup(x => x.DoesUserExist(userLookup)).ReturnsAsync(true); MockCollection.Setup(x => x.ExistsAsync(userLookup.ToLower(), null)) .ReturnsAsync(new FakeExistsResult(true)); MockCollection.Setup(x => x.GetAsync(userLookup.ToLower(), null)) .ReturnsAsync(new FakeGetResult(new TwitcherProfile())); var shout = new ShoutOut(chatMessage); // act await _handler.Handle(shout, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), It.IsAny <string>(), false), Times.Once); }
public async Task Send_farfare_notice_when_user_has_fanfare_and_is_arriving(bool hasFanfare, int timesSent) { // arrange var username = "******"; var expectedFanfare = new FanfareInfo { Message = "message " + Guid.NewGuid(), Timeout = 12312, YouTubeCode = "ytcode" + Guid.NewGuid(), YouTubeStartTime = 111, YouTubeEndTime = 222 }; var twitchLibMessage = TwitchLibMessageBuilder.Create().WithUsername(username).Build(); var chatMessage = ChatMessageBuilder.Create().WithTwitchLibMessage(twitchLibMessage).Build(); var request = new UserHasArrived(chatMessage); MockCollection.Setup(x => x.ExistsAsync($"{username}::arrived_recently", null)) .ReturnsAsync(new FakeExistsResult(false)); MockCollection.Setup(x => x.GetAsync(It.IsAny <string>(), null)) .ReturnsAsync(new FakeGetResult(new TwitcherProfile { HasFanfare = hasFanfare, Fanfare = expectedFanfare })); // act await _handler.Handle(request, CancellationToken.None); // assert _mockTwitchHub.Verify(x => x.ReceiveFanfare(expectedFanfare), Times.Exactly(timesSent)); }
public async Task Should_insert_message_into_bucket() { // arrange var expectedUsername = "******" + Guid.NewGuid(); var expectedMessage = "some message whatever " + Guid.NewGuid(); var expectedChannel = "mychannel" + Guid.NewGuid(); var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername(expectedUsername) .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage(expectedMessage) .WithChannel(expectedChannel) .Build(); var request = new StoreMessage(chatMessage); // act await _handler.Handle(request, CancellationToken.None); // assert MockCollection.Verify(x => x.InsertAsync(It.IsAny <string>(), It.IsAny <ChatMessage>(), null), Times.Once()); MockCollection.Verify(x => x.InsertAsync(It.IsAny <string>(), It.Is <ChatMessage>(d => d.Username == expectedUsername), null), Times.Once()); MockCollection.Verify(x => x.InsertAsync(It.IsAny <string>(), It.Is <ChatMessage>(d => d.Message == expectedMessage), null), Times.Once()); MockCollection.Verify(x => x.InsertAsync(It.IsAny <string>(), It.Is <ChatMessage>(d => d.Channel == expectedChannel), null), Times.Once()); }
public async Task If_no_current_project_set_show_default_message() { // arrange var expectedDefaultMessage = "I haven't set any current project yet, sorry!"; var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("doesntmatterusername") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage("!currentproject") .WithChannel("doesntmatterchannel") .Build(); var request = new SayCurrentProject(chatMessage); _mockBucket.Setup(x => x.Get <CurrentProjectInfo>("currentProject")) .Returns(new FakeOperationResult <CurrentProjectInfo> { Success = false }); // act await _handler.Handle(request, CancellationToken.None); // assert _mockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), expectedDefaultMessage, false), Times.Once); }
public async Task Create_recent_activity_marker_document_if_necessary() { // arrange var username = "******"; MockCollection.Setup(x => x.ExistsAsync($"{username}::arrived_recently", null)) .ReturnsAsync(new FakeExistsResult(false)); var twitchLibMessage = TwitchLibMessageBuilder.Create().WithUsername(username).Build(); var chatMessage = ChatMessageBuilder.Create().WithTwitchLibMessage(twitchLibMessage).Build(); var request = new UserHasArrived(chatMessage); MockCollection.Setup(x => x.GetAsync(It.IsAny <string>(), null)) .ReturnsAsync(new FakeGetResult(new TwitcherProfile())); _mockTwitchHub.Setup(x => x.ReceiveFanfare(It.IsAny <FanfareInfo>())); // act await _handler.Handle(request, CancellationToken.None); // assert MockCollection.Verify(x => x.UpsertAsync( It.Is <string>(k => k == $"{username}::arrived_recently"), It.IsAny <UserHasArrivedMarker>(), It.IsAny <UpsertOptions>()), Times.Once); MockCollection.Verify(x => x.UpsertAsync( It.IsAny <string>(), It.IsAny <UserHasArrivedMarker>(), It.Is <UpsertOptions>(u => (u.GetInternalPropertyValue <TimeSpan, UpsertOptions>("ExpiryValue")).Hours == 12)), Times.Once); }
public async Task ShoutOut_will_use_custom_message_if_there_is_one() { // arrange var userProfile = new TwitcherProfile { ShoutMessage = "hey hey look at me" + Guid.NewGuid() }; var userName = "******"; var expectedShoutMessage = userProfile.ShoutMessage + $" https://twitch.tv/{userName}"; var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("doesntmatter") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithIsSubscriber(true) .WithMessage($"!so {userName}") .Build(); MockApiWrapper.Setup(x => x.DoesUserExist(userName)).ReturnsAsync(true); MockCollection.Setup(x => x.ExistsAsync(userName.ToLower(), null)) .ReturnsAsync(new FakeExistsResult(true)); MockCollection.Setup(x => x.GetAsync(userName.ToLower(), null)) .ReturnsAsync(new FakeGetResult(userProfile)); var shout = new ShoutOut(chatMessage); // act await _handler.Handle(shout, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), expectedShoutMessage, false), Times.Once); }
public async Task Is_chat_message_stored() { // arrange var expectedUsername = "******" + Guid.NewGuid(); var expectedMessage = "some message whatever " + Guid.NewGuid(); var expectedChannel = "mychannel" + Guid.NewGuid(); var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername(expectedUsername) .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage(expectedMessage) .WithChannel(expectedChannel) .Build(); var request = new StoreMessage(chatMessage); // act await _handler.Handle(request, CancellationToken.None); // assert var n1ql = $"SELECT RAW COUNT(*) FROM `{Bucket.Name}` WHERE message = $expectedMessage"; var result = await TestCluster.QueryAsync <int>(n1ql, QueryOptions.Create().Parameter("expectedMessage", expectedMessage).ScanConsistency(QueryScanConsistency.RequestPlus)); var count = await result.Rows.FirstOrDefaultAsync(); Assert.That(count, Is.EqualTo(1)); }
/// <summary> /// 增加订阅者(群组话题使用) /// </summary> /// <param name="subsricber">订阅者对象</param> /// <returns>结果</returns> public async Task <bool> AddSubscriber(Subscriber subscriber) { //判断订阅者是否位于订阅者列表中 if (instance.SubsriberList.Contains(subscriber)) { //重复添加返回假 return(false); } subscriber.TopicName = instance.Name; instance.SubsriberList.Add(subscriber); //调用订阅者控制器更新订阅者 SubscriberController subscriberController = new SubscriberController(db.Subscribers); subscriberController.SetSubscriber(subscriber); subscriberController.UpsertSubscriber(); //更新话题时间戳 instance.LastUsed = ChatMessageBuilder.GetTimeStamp(); var dbContext = db.Topics.GetRepository(); await dbContext.UpsertTopic(instance); //添加成功返回真 return(true); }
public WhenUserCommandReceived() { Sut .AddCommand(MockedUserCommand1.Object) .AddCommand(MockedUserCommand2.Object); ChatMessage = ChatMessageBuilder .Create() .Build(); Sut.Enable(MockedUserCommand1.Object.Name); var userCommandName = MockedUserCommand1.Object.Name; UserCommandArgs = new OnUserCommandReceivedArgs(ChatMessage, Array.Empty <String>()); var userCommandArgs = UserCommandArgs; MockedUserCommandValidator .Setup(x => x.TryValidateCommand(ChatMessage, out userCommandName, out userCommandArgs)) .Returns(true); MessageArgs = new OnMessageReceivedArgs() { ChatMessage = ChatMessage }; MockedTwitchClient.Raise(x => x.OnMessageReceived += null, MessageArgs); }
public async Task ShoutOut_is_limited_to_mods_and_subs(bool isSub, bool isMod, int numVerified) { // arrange var userToShout = "someusername"; var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("NonSub") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage($"!so {userToShout}") .WithIsSubscriber(isSub) .WithIsModerator(isMod) .Build(); var request = new ShoutOut(chatMessage); MockApiWrapper.Setup(m => m.DoesUserExist(It.IsAny <string>())).ReturnsAsync(true); MockCollection.Setup(m => m.ExistsAsync(userToShout, null)) .ReturnsAsync(new FakeExistsResult(true)); MockCollection.Setup(m => m.GetAsync(userToShout, null)) .ReturnsAsync(new FakeGetResult(new TwitcherProfile())); // act await _handler.Handle(request, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), It.IsAny <string>(), false), Times.Exactly(numVerified)); }
/// <summary> /// 发送消息 /// </summary> /// <param name="message">消息</param> /// <returns></returns> public async void SendMessage(ChatMessage message) { //话题更新时间戳 instance.LastUsed = ChatMessageBuilder.GetTimeStamp(); var dbContext = db.Topics.GetRepository(); await dbContext.UpsertTopic(instance); client.Send(instance, message, false); }
/// <summary> /// 设置备注 /// </summary> /// <param name="comment">备注</param> /// <returns></returns> public async Task SetPrivateComment(string comment) { client.SetPrivateComment(instance, comment); //话题更新时间戳 instance.LastUsed = ChatMessageBuilder.GetTimeStamp(); instance.PrivateComment = comment; var dbContext = db.Topics.GetRepository(); await dbContext.UpsertTopic(instance); }
/// <summary> /// 构造函数 /// </summary> /// <param name="name">话题名</param> public Topic(string name) { Name = name; Limit = 24; Status = 0; IsVisible = true; LastUsed = ChatMessageBuilder.GetTimeStamp(); SubsriberList = new List <Subscriber>(); MessageList = new List <ChatMessage>(); }
public WhenOnMessageReceived() { ExpectedMessage = Guid.NewGuid().ToString(); ExpectedDisplayName = Guid.NewGuid().ToString(); ChatMessage = ChatMessageBuilder .Create() .WithTwitchLibMessage(TwitchLibMessageBuilder .Create() .WithDisplayName(ExpectedDisplayName)) .WithMessage(ExpectedMessage) .Build(); }
public void ShouldValidateCommand(String input, String expectedUserCommandName, String[] expectedWords) { Boolean result = Sut.TryValidateCommand( ChatMessageBuilder.Create() .WithMessage(input) .Build(), out var userCommandName, out var args); result.Should().BeTrue(); userCommandName.Value.Should().Be(expectedUserCommandName); args.Words.Should().Equal(expectedWords); }
public void ShouldIgnoreNonCommand(String input) { Boolean result = Sut.TryValidateCommand( ChatMessageBuilder.Create() .WithMessage(input) .Build(), out var userCommandName, out var args); result.Should().BeFalse(); userCommandName.Should().BeNull(); args.Should().BeNull(); }
/// <summary> /// 新增消息 /// </summary> /// <param name="message">消息</param> /// <returns>结果</returns> public async Task <bool> AddMessage(ChatMessage message) { //判断消息是否已存在 //if (instance.MessageList.Contains(message)) //{ //已存在则添加失败返回假 // return false; //} int newSeqId = message.SeqId; int oldSeqId = instance.MessageList.Count == 0 ? instance.MinLocalSeqId : instance.MessageList[0].SeqId; message.TopicName = instance.Name; //判断是否为初次添加话题 if (oldSeqId == 0) { instance.MessageList.Add(message); //更新本地消息序号 instance.MinLocalSeqId = newSeqId; instance.MaxLocalSeqId = newSeqId; //判断是否为历史消息 } else if (oldSeqId >= newSeqId) { instance.MessageList.Insert(0, message); instance.MinLocalSeqId = newSeqId; } else { instance.MessageList.Add(message); instance.MaxLocalSeqId = newSeqId; } //调用消息控制器添加消息 MessageController messageController = new MessageController(db.Messages); messageController.SetMessage(message); messageController.UpsertMessage(); //话题更新时间戳 instance.Recieve = message.SeqId; instance.LastUsed = ChatMessageBuilder.GetTimeStamp(); var dbContext = db.Topics.GetRepository(); await dbContext.UpsertTopic(instance); //添加成功返回真 return(true); }
public async Task Commands_returns_the_correct_requests(string command, Type type) { // arrange var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(_twitchLibMessage) .WithMessage(command) .Build(); // act var result = await _factory.BuildCommand(chatMessage); // assert Assert.That(result, Is.TypeOf(type)); }
private void SendText(string text, string name = "") { Player player = (Player)Invoker; foreach (string line in text.Trim().Split(Environment.NewLine)) { var builder = new ChatMessageBuilder { Type = ChatChannelType.System, FromName = name, Text = line, Guid = player.Guid }; player.Session.EnqueueMessageEncrypted(builder.Build()); } }
public void ShouldIgnoreUser(String input) { foreach (String id in TwitchUserIDs.ChannelBots) { Boolean result = Sut.TryValidateCommand( ChatMessageBuilder.Create() .WithTwitchLibMessage(TwitchLibMessageBuilder.Create().WithUserId(id).Build()) .WithMessage(input) .Build(), out var userCommandName, out var args); result.Should().BeFalse(); userCommandName.Should().BeNull(); args.Should().BeNull(); } }
public async Task Valid_url_must_be_passed_in(string message) { // arrange var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername(_mockOptions.Object.Value.Username) .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithMessage(message) .Build(); var request = new SetCurrentProject(chatMessage); // act await _handler.Handle(request, CancellationToken.None); // assert _mockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), "Sorry, I couldn't understand that URL!", false), Times.Once); }
public async Task ShoutOut_will_do_nothing_if_no_name_is_given() { // arrange var twitchLibMessage = TwitchLibMessageBuilder.Create() .WithUsername("doesntmatter") .Build(); var chatMessage = ChatMessageBuilder.Create() .WithTwitchLibMessage(twitchLibMessage) .WithIsSubscriber(true) .WithMessage("!so") .Build(); var request = new ShoutOut(chatMessage); // act await _handler.Handle(request, CancellationToken.None); // assert MockTwitchClient.Verify(x => x.SendMessage(It.IsAny <string>(), It.IsAny <string>(), false), Times.Never); }