-
Notifications
You must be signed in to change notification settings - Fork 66
/
Copy pathConnectionRequestHandler.cs
169 lines (149 loc) · 7.07 KB
/
ConnectionRequestHandler.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
using IntermediatorBotSample.Resources;
using Microsoft.Bot.Schema;
using System.Collections.Generic;
using System.Threading.Tasks;
using Underscore.Bot.MessageRouting;
using Underscore.Bot.MessageRouting.DataStore;
using Underscore.Bot.MessageRouting.Models;
using Underscore.Bot.MessageRouting.Results;
namespace IntermediatorBotSample.MessageRouting
{
/// <summary>
/// Contains utility methods for accepting and rejecting connection requests.
/// </summary>
public class ConnectionRequestHandler
{
private IList<string> _noDirectConversationsWithChannels;
/// <summary>
/// Constructor.
/// </summary>
/// <param name="noDirectConversationsWithChannels">Does not try to create direct
/// conversations when the agent is on one of the channels on this list.</param>
public ConnectionRequestHandler(IList<string> noDirectConversationsWithChannels)
{
_noDirectConversationsWithChannels = noDirectConversationsWithChannels;
}
/// <summary>
/// Tries to accept/reject a pending connection request.
/// </summary>
/// <param name="messageRouter">The message router.</param>
/// <param name="messageRouterResultHandler">The message router result handler.</param>
/// <param name="sender">The sender party (accepter/rejecter).</param>
/// <param name="doAccept">If true, will try to accept the request. If false, will reject.</param>
/// <param name="requestorChannelAccountId">The channel account ID of the user/bot whose request to accept/reject.</param>
/// <param name="requestorConversationAccountId">The conversation account ID of the user/bot whose request to accept/reject.</param>
/// <returns>The result.</returns>
public async Task<AbstractMessageRouterResult> AcceptOrRejectRequestAsync(
MessageRouter messageRouter, MessageRouterResultHandler messageRouterResultHandler,
ConversationReference sender, bool doAccept,
ChannelAccount requestorChannelAccountId, ConversationAccount requestorConversationAccountId)
{
AbstractMessageRouterResult messageRouterResult = new ConnectionRequestResult()
{
Type = ConnectionRequestResultType.Error
};
ConversationReference requestor =
new ConversationReference(
null, requestorChannelAccountId, null, requestorConversationAccountId);
ConnectionRequest connectionRequest =
messageRouter.RoutingDataManager.FindConnectionRequest(requestor);
if (connectionRequest == null)
{
// Try bot
requestor.Bot = requestor.User;
requestor.User = null;
connectionRequest =
messageRouter.RoutingDataManager.FindConnectionRequest(requestor);
}
if (connectionRequest != null)
{
Connection connection = null;
if (sender != null)
{
connection = messageRouter.RoutingDataManager.FindConnection(sender);
}
ConversationReference senderInConnection = null;
ConversationReference counterpart = null;
if (connection != null && connection.ConversationReference1 != null)
{
if (RoutingDataManager.Match(sender, connection.ConversationReference1))
{
senderInConnection = connection.ConversationReference1;
counterpart = connection.ConversationReference2;
}
else
{
senderInConnection = connection.ConversationReference2;
counterpart = connection.ConversationReference1;
}
}
if (doAccept)
{
if (senderInConnection != null)
{
// The sender (accepter/rejecter) is ALREADY connected to another party
if (counterpart != null)
{
messageRouterResult.ErrorMessage = string.Format(
Strings.AlreadyConnectedWithUser,
RoutingDataManager.GetChannelAccount(counterpart)?.Name);
}
else
{
messageRouterResult.ErrorMessage = Strings.ErrorOccured;
}
}
else
{
bool createNewDirectConversation =
(_noDirectConversationsWithChannels == null
|| !(_noDirectConversationsWithChannels.Contains(sender.ChannelId.ToLower())));
// Try to accept
messageRouterResult = await messageRouter.ConnectAsync(
sender,
connectionRequest.Requestor,
createNewDirectConversation);
}
}
else
{
// Note: Rejecting is OK even if the sender is alreay connected
messageRouterResult = messageRouter.RejectConnectionRequest(connectionRequest.Requestor, sender);
}
}
else
{
messageRouterResult.ErrorMessage = Strings.FailedToFindPendingRequest;
}
return messageRouterResult;
}
/// <summary>
/// Tries to reject all pending requests.
/// </summary>
/// <param name="messageRouter">The message router.</param>
/// <param name="messageRouterResultHandler">The message router result handler.</param>
/// <returns>True, if successful. False otherwise.</returns>
public async Task<bool> RejectAllPendingRequestsAsync(
MessageRouter messageRouter, MessageRouterResultHandler messageRouterResultHandler)
{
bool wasSuccessful = false;
IList<ConnectionRequest> connectionRequests = messageRouter.RoutingDataManager.GetConnectionRequests();
if (connectionRequests.Count > 0)
{
IList<ConnectionRequestResult> connectionRequestResults =
new List<ConnectionRequestResult>();
foreach (ConnectionRequest connectionRequest in connectionRequests)
{
connectionRequestResults.Add(
messageRouter.RejectConnectionRequest(connectionRequest.Requestor));
}
foreach (ConnectionRequestResult connectionRequestResult in connectionRequestResults)
{
await messageRouterResultHandler.HandleResultAsync(connectionRequestResult);
}
wasSuccessful = true;
}
return wasSuccessful;
}
}
}