Skip to content

Commit

Permalink
[C#] feat: handles message update/delete events
Browse files Browse the repository at this point in the history
- messageUpdate - editMessage
- messageUpdate - undeleteMessage
- messageDelete - softDeleteMessage
  • Loading branch information
kuojianlu committed Oct 31, 2023
1 parent 9983f26 commit dd78b09
Show file tree
Hide file tree
Showing 2 changed files with 221 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Microsoft.Bot.Builder;
using Microsoft.Bot.Connector;
using Microsoft.Bot.Schema;
using Microsoft.Bot.Schema.Teams;
using Microsoft.TeamsAI.Tests.TestUtils;
Expand Down Expand Up @@ -820,6 +821,162 @@ public async Task Test_OnMessage_Multiple_Selectors()
Assert.Equal("hello world", texts[2]);
}

[Fact]
public async Task Test_OnMessageEdit()
{
// Arrange
var activity1 = new Activity
{
Type = ActivityTypes.MessageUpdate,
ChannelId = Channels.Msteams,
ChannelData = new TeamsChannelData
{
EventType = "editMessage"
},
Name = "1"
};
var activity2 = new Activity
{
Type = ActivityTypes.MessageUpdate,
ChannelId = Channels.Msteams,
ChannelData = new TeamsChannelData
{
EventType = "softDeleteMessage"
}
};
var activity3 = new Activity
{
Type = ActivityTypes.Message
};
var adapter = new NotImplementedAdapter();
var turnContext1 = new TurnContext(adapter, activity1);
var turnContext2 = new TurnContext(adapter, activity2);
var turnContext3 = new TurnContext(adapter, activity3);
var app = new Application<TestTurnState, TestTurnStateManager>(new()
{
RemoveRecipientMention = false,
});
var names = new List<string>();
app.OnMessageEdit((turnContext, _, _) =>
{
names.Add(turnContext.Activity.Name);
return Task.CompletedTask;
});

// Act
await app.OnTurnAsync(turnContext1);
await app.OnTurnAsync(turnContext2);
await app.OnTurnAsync(turnContext3);

// Assert
Assert.Single(names);
Assert.Equal("1", names[0]);
}

[Fact]
public async Task Test_OnMessageUnDelete()
{
// Arrange
var activity1 = new Activity
{
Type = ActivityTypes.MessageUpdate,
ChannelId = Channels.Msteams,
ChannelData = new TeamsChannelData
{
EventType = "undeleteMessage"
},
Name = "1"
};
var activity2 = new Activity
{
Type = ActivityTypes.MessageUpdate,
ChannelId = Channels.Msteams,
ChannelData = new TeamsChannelData
{
EventType = "softDeleteMessage"
}
};
var activity3 = new Activity
{
Type = ActivityTypes.Message
};
var adapter = new NotImplementedAdapter();
var turnContext1 = new TurnContext(adapter, activity1);
var turnContext2 = new TurnContext(adapter, activity2);
var turnContext3 = new TurnContext(adapter, activity3);
var app = new Application<TestTurnState, TestTurnStateManager>(new()
{
RemoveRecipientMention = false,
});
var names = new List<string>();
app.OnMessageUndelete((turnContext, _, _) =>
{
names.Add(turnContext.Activity.Name);
return Task.CompletedTask;
});

// Act
await app.OnTurnAsync(turnContext1);
await app.OnTurnAsync(turnContext2);
await app.OnTurnAsync(turnContext3);

// Assert
Assert.Single(names);
Assert.Equal("1", names[0]);
}

[Fact]
public async Task Test_OnMessageDelete()
{
// Arrange
var activity1 = new Activity
{
Type = ActivityTypes.MessageDelete,
ChannelId = Channels.Msteams,
ChannelData = new TeamsChannelData
{
EventType = "softDeleteMessage"
},
Name = "1"
};
var activity2 = new Activity
{
Type = ActivityTypes.MessageDelete,
ChannelId = Channels.Msteams,
ChannelData = new TeamsChannelData
{
EventType = "unknown"
}
};
var activity3 = new Activity
{
Type = ActivityTypes.Message
};
var adapter = new NotImplementedAdapter();
var turnContext1 = new TurnContext(adapter, activity1);
var turnContext2 = new TurnContext(adapter, activity2);
var turnContext3 = new TurnContext(adapter, activity3);
var app = new Application<TestTurnState, TestTurnStateManager>(new()
{
RemoveRecipientMention = false,
});
var names = new List<string>();
app.OnMessageDelete((turnContext, _, _) =>
{
names.Add(turnContext.Activity.Name);
return Task.CompletedTask;
});

// Act
await app.OnTurnAsync(turnContext1);
await app.OnTurnAsync(turnContext2);
await app.OnTurnAsync(turnContext3);

// Assert
Assert.Single(names);
Assert.Equal("1", names[0]);
}

[Fact]
public async Task Test_OnMessageReactionsAdded()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Integration.AspNet.Core;
using Microsoft.Bot.Connector;
using Microsoft.Bot.Schema;
using Microsoft.Bot.Schema.Teams;
using Microsoft.TeamsAI.AI;
Expand Down Expand Up @@ -388,6 +389,69 @@ public Application<TState, TTurnStateManager> OnMessage(MultipleRouteSelector ro
return this;
}

/// <summary>
/// Handles message edit events.
/// </summary>
/// <param name="handler">Function to call when the event is triggered.</param>
/// <returns>The application instance for chaining purposes.</returns>
public Application<TState, TTurnStateManager> OnMessageEdit(RouteHandler<TState> handler)
{
Verify.ParamNotNull(handler);
RouteSelector routeSelector = (turnContext, cancellationToken) =>
{
TeamsChannelData teamsChannelData;
return Task.FromResult(
string.Equals(turnContext.Activity.Type, ActivityTypes.MessageUpdate, StringComparison.OrdinalIgnoreCase)
&& string.Equals(turnContext.Activity.ChannelId, Channels.Msteams)
&& (teamsChannelData = turnContext.Activity.GetChannelData<TeamsChannelData>()) != null
&& string.Equals(teamsChannelData.EventType, "editMessage"));
};
AddRoute(routeSelector, handler, isInvokeRoute: false);
return this;
}

/// <summary>
/// Handles message undo soft delete events.
/// </summary>
/// <param name="handler">Function to call when the event is triggered.</param>
/// <returns>The application instance for chaining purposes.</returns>
public Application<TState, TTurnStateManager> OnMessageUndelete(RouteHandler<TState> handler)
{
Verify.ParamNotNull(handler);
RouteSelector routeSelector = (turnContext, cancellationToken) =>
{
TeamsChannelData teamsChannelData;
return Task.FromResult(
string.Equals(turnContext.Activity.Type, ActivityTypes.MessageUpdate, StringComparison.OrdinalIgnoreCase)
&& string.Equals(turnContext.Activity.ChannelId, Channels.Msteams)
&& (teamsChannelData = turnContext.Activity.GetChannelData<TeamsChannelData>()) != null
&& string.Equals(teamsChannelData.EventType, "undeleteMessage"));
};
AddRoute(routeSelector, handler, isInvokeRoute: false);
return this;
}

/// <summary>
/// Handles message soft delete events.
/// </summary>
/// <param name="handler">Function to call when the event is triggered.</param>
/// <returns>The application instance for chaining purposes.</returns>
public Application<TState, TTurnStateManager> OnMessageDelete(RouteHandler<TState> handler)
{
Verify.ParamNotNull(handler);
RouteSelector routeSelector = (turnContext, cancellationToken) =>
{
TeamsChannelData teamsChannelData;
return Task.FromResult(
string.Equals(turnContext.Activity.Type, ActivityTypes.MessageDelete, StringComparison.OrdinalIgnoreCase)
&& string.Equals(turnContext.Activity.ChannelId, Channels.Msteams)
&& (teamsChannelData = turnContext.Activity.GetChannelData<TeamsChannelData>()) != null
&& string.Equals(teamsChannelData.EventType, "softDeleteMessage"));
};
AddRoute(routeSelector, handler, isInvokeRoute: false);
return this;
}

/// <summary>
/// Handles message reactions added events.
/// </summary>
Expand Down

0 comments on commit dd78b09

Please sign in to comment.