microsoft/teams.net
Publicmirrored fromhttps://github.com/microsoft/teams.netAvailable
Libraries/Microsoft.Teams.Apps/Contexts/Context.cs
202lines · modecode
| 1 | // Copyright (c) Microsoft Corporation. All rights reserved. |
| 2 | // Licensed under the MIT License. |
| 3 | |
| 4 | using System.Text.Json; |
| 5 | using System.Text.Json.Serialization; |
| 6 | |
| 7 | using Microsoft.Teams.Api; |
| 8 | using Microsoft.Teams.Api.Activities; |
| 9 | using Microsoft.Teams.Api.Auth; |
| 10 | using Microsoft.Teams.Api.Clients; |
| 11 | using Microsoft.Teams.Apps.Plugins; |
| 12 | using Microsoft.Teams.Common.Logging; |
| 13 | using Microsoft.Teams.Common.Storage; |
| 14 | |
| 15 | namespace Microsoft.Teams.Apps; |
| 16 | |
| 17 | internal delegate Task ActivitySentHandler(IActivity activity, IContext<IActivity> context); |
| 18 | |
| 19 | public partial interface IContext<TActivity> where TActivity : IActivity |
| 20 | { |
| 21 | /// <summary> |
| 22 | /// the plugin that received the activity |
| 23 | /// </summary> |
| 24 | public ISenderPlugin Sender { get; } |
| 25 | |
| 26 | /// <summary> |
| 27 | /// the stream instance |
| 28 | /// </summary> |
| 29 | public IStreamer Stream { get; } |
| 30 | |
| 31 | /// <summary> |
| 32 | /// the app id of the bot |
| 33 | /// </summary> |
| 34 | public string AppId { get; set; } |
| 35 | |
| 36 | /// <summary> |
| 37 | /// the tenant id of the request/activity |
| 38 | /// </summary> |
| 39 | public string TenantId { get; set; } |
| 40 | |
| 41 | /// <summary> |
| 42 | /// the app logger instance |
| 43 | /// </summary> |
| 44 | public ILogger Log { get; set; } |
| 45 | |
| 46 | /// <summary> |
| 47 | /// the app storage instance |
| 48 | /// </summary> |
| 49 | public IStorage<string, object> Storage { get; set; } |
| 50 | |
| 51 | /// <summary> |
| 52 | /// the api client |
| 53 | /// </summary> |
| 54 | public ApiClient Api { get; set; } |
| 55 | |
| 56 | /// <summary> |
| 57 | /// the inbound activity |
| 58 | /// </summary> |
| 59 | public TActivity Activity { get; set; } |
| 60 | |
| 61 | /// <summary> |
| 62 | /// the inbound activity conversation reference |
| 63 | /// </summary> |
| 64 | public ConversationReference Ref { get; set; } |
| 65 | |
| 66 | /// <summary> |
| 67 | /// The user's access token to the Microsoft Graph API. |
| 68 | /// </summary> |
| 69 | public JsonWebToken? UserGraphToken { get; set; } |
| 70 | |
| 71 | /// <summary> |
| 72 | /// any extra data |
| 73 | /// </summary> |
| 74 | public IDictionary<string, object?> Extra { get; set; } |
| 75 | |
| 76 | /// <summary> |
| 77 | /// the cancellation token |
| 78 | /// </summary> |
| 79 | public CancellationToken CancellationToken { get; } |
| 80 | |
| 81 | /// <summary> |
| 82 | /// destruct the context |
| 83 | /// </summary> |
| 84 | /// <param name="log">the ILogger instance</param> |
| 85 | /// <param name="api">the api client</param> |
| 86 | /// <param name="activity">the inbound activity</param> |
| 87 | public void Deconstruct(out ILogger log, out ApiClient api, out TActivity activity); |
| 88 | |
| 89 | /// <summary> |
| 90 | /// destruct the context |
| 91 | /// </summary> |
| 92 | /// <param name="log">the ILogger instance</param> |
| 93 | /// <param name="api">the api client</param> |
| 94 | /// <param name="activity">the inbound activity</param> |
| 95 | /// <param name="send">the methods to send activities</param> |
| 96 | public void Deconstruct(out ILogger log, out ApiClient api, out TActivity activity, out IContext.Client client); |
| 97 | |
| 98 | /// <summary> |
| 99 | /// destruct the context |
| 100 | /// </summary> |
| 101 | /// <param name="appId">the apps id</param> |
| 102 | /// <param name="log">the ILogger instance</param> |
| 103 | /// <param name="api">the api client</param> |
| 104 | /// <param name="activity">the inbound activity</param> |
| 105 | /// <param name="reference">the inbound conversation reference</param> |
| 106 | /// <param name="send">the methods to send activities</param> |
| 107 | public void Deconstruct(out string appId, out ILogger log, out ApiClient api, out TActivity activity, out ConversationReference reference, out IContext.Client client); |
| 108 | |
| 109 | /// <summary> |
| 110 | /// called to continue the chain of route handlers, |
| 111 | /// if not called no other handlers in the sequence will be executed |
| 112 | /// </summary> |
| 113 | public Task<object?> Next(); |
| 114 | |
| 115 | /// <summary> |
| 116 | /// convert the context to that of another activity type |
| 117 | /// </summary> |
| 118 | public IContext<IActivity> ToActivityType(); |
| 119 | |
| 120 | /// <summary> |
| 121 | /// convert the context to that of another activity type |
| 122 | /// </summary> |
| 123 | public IContext<TToActivity> ToActivityType<TToActivity>() where TToActivity : IActivity; |
| 124 | } |
| 125 | |
| 126 | public partial class Context<TActivity>(ISenderPlugin sender, IStreamer stream) : IContext<TActivity> where TActivity : IActivity |
| 127 | { |
| 128 | public ISenderPlugin Sender { get; set; } = sender; |
| 129 | public IStreamer Stream { get; set; } = stream; |
| 130 | |
| 131 | public required string AppId { get; set; } |
| 132 | public required string TenantId { get; set; } |
| 133 | public required ILogger Log { get; set; } |
| 134 | public required IStorage<string, object> Storage { get; set; } |
| 135 | public required ApiClient Api { get; set; } |
| 136 | public required TActivity Activity { get; set; } |
| 137 | public required ConversationReference Ref { get; set; } |
| 138 | public required JsonWebToken? UserGraphToken { get; set; } |
| 139 | public IDictionary<string, object?> Extra { get; set; } = new Dictionary<string, object?>(); |
| 140 | public CancellationToken CancellationToken { get; set; } |
| 141 | |
| 142 | internal Func<IContext<IActivity>, Task<object?>> OnNext { get; set; } = (_) => Task.FromResult<object?>(null); |
| 143 | internal ActivitySentHandler OnActivitySent { get; set; } = (_, _) => Task.CompletedTask; |
| 144 | |
| 145 | public void Deconstruct(out ILogger log, out ApiClient api, out TActivity activity) |
| 146 | { |
| 147 | log = Log; |
| 148 | api = Api; |
| 149 | activity = Activity; |
| 150 | } |
| 151 | |
| 152 | public void Deconstruct(out ILogger log, out ApiClient api, out TActivity activity, out IContext.Client client) |
| 153 | { |
| 154 | log = Log; |
| 155 | api = Api; |
| 156 | activity = Activity; |
| 157 | client = new IContext.Client(ToActivityType()); |
| 158 | } |
| 159 | |
| 160 | public void Deconstruct(out string appId, out ILogger log, out ApiClient api, out TActivity activity, out ConversationReference reference, out IContext.Client client) |
| 161 | { |
| 162 | appId = AppId; |
| 163 | log = Log; |
| 164 | api = Api; |
| 165 | activity = Activity; |
| 166 | reference = Ref; |
| 167 | client = new IContext.Client(ToActivityType()); |
| 168 | } |
| 169 | |
| 170 | public Task<object?> Next() => OnNext(ToActivityType()); |
| 171 | public IContext<IActivity> ToActivityType() => ToActivityType<IActivity>(); |
| 172 | public IContext<TToActivity> ToActivityType<TToActivity>() where TToActivity : IActivity |
| 173 | { |
| 174 | return new Context<TToActivity>(Sender, Stream) |
| 175 | { |
| 176 | Sender = Sender, |
| 177 | AppId = AppId, |
| 178 | TenantId = TenantId, |
| 179 | Log = Log, |
| 180 | Storage = Storage, |
| 181 | Api = Api, |
| 182 | Activity = (TToActivity)Activity.ToType(typeof(TToActivity), null), |
| 183 | Ref = Ref, |
| 184 | UserGraphToken = UserGraphToken, |
| 185 | IsSignedIn = IsSignedIn, |
| 186 | ConnectionName = ConnectionName, |
| 187 | Extra = Extra, |
| 188 | CancellationToken = CancellationToken, |
| 189 | OnNext = OnNext, |
| 190 | OnActivitySent = OnActivitySent |
| 191 | }; |
| 192 | } |
| 193 | |
| 194 | public override string ToString() |
| 195 | { |
| 196 | return JsonSerializer.Serialize(this, new JsonSerializerOptions() |
| 197 | { |
| 198 | WriteIndented = true, |
| 199 | DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull |
| 200 | }); |
| 201 | } |
| 202 | } |