microsoft/teams.net

Public

mirrored fromhttps://github.com/microsoft/teams.netAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v2.0.0-preview.5

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

Libraries/Microsoft.Teams.Apps/Events/EventEmitter.cs

82lines · modepreview

using Microsoft.Teams.Apps.Plugins;

namespace Microsoft.Teams.Apps.Events;

internal class EventEmitter
{
    protected Dictionary<string, Topic> Topics { get; set; } = [];

    public EventEmitter On(string name, Action<IPlugin, Event> handler)
    {
        if (!Topics.ContainsKey(name))
        {
            Topics[name] = [];
        }

        Topics[name].Add((plugin, @event, cancellationToken) =>
        {
            handler(plugin, @event);
            return Task.FromResult<object?>(null);
        });

        return this;
    }

    public EventEmitter On<TResult>(string name, Func<IPlugin, Event, TResult> handler)
    {
        if (!Topics.ContainsKey(name))
        {
            Topics[name] = [];
        }

        Topics[name].Add((plugin, @event, cancellationToken) =>
        {
            var res = handler(plugin, @event);
            return Task.FromResult<object?>(res);
        });

        return this;
    }

    public EventEmitter On(string name, Func<IPlugin, Event, CancellationToken, Task> handler)
    {
        if (!Topics.ContainsKey(name))
        {
            Topics[name] = [];
        }

        Topics[name].Add(async (plugin, @event, cancellationToken) =>
        {
            await handler(plugin, @event, cancellationToken);
            return null;
        });

        return this;
    }

    public EventEmitter On<TResult>(string name, Func<IPlugin, Event, CancellationToken, Task<TResult>> handler)
    {
        if (!Topics.ContainsKey(name))
        {
            Topics[name] = [];
        }

        Topics[name].Add(async (plugin, @event, cancellationToken) =>
        {
            var res = await handler(plugin, @event, cancellationToken);
            return res;
        });

        return this;
    }

    public async Task<object?> Emit(IPlugin plugin, string name, Event? @event = null, CancellationToken cancellationToken = default)
    {
        if (!Topics.ContainsKey(name))
        {
            Topics[name] = [];
        }

        return await Topics[name].Emit(plugin, @event, cancellationToken);
    }
}