Microsoft Teams最近推出了很多新的功能和api,我們今天就來一起看一下 teams 會議的實時事件通知,我覺得有了這個功能,我們的app,我們的bot又可以有很多可以實現的場景了。
我們來看看如何在 c# 里處理會議開始和結束這兩個事件。
protected override async Task OnTeamsMeetingStartAsync(MeetingStartEventDetails startDetails, ITurnContext<IEventActivity> turnContext, CancellationToken cancellationToken)
{...
}protected override async Task OnTeamsMeetingEndAsync(MeetingEndEventDetails endDetails, ITurnContext<IEventActivity> turnContext, CancellationToken cancellationToken)
{...
}
在我們的bot 處理class的地方,我們需要重載?OnTeamsMeetingStartAsync
?和?OnTeamsMeetingEndAsync
?就可以了。
這兩個函數的第一個參數里含有了事件的具體信息。具體如下:
public partial class MeetingStartEventDetails : MeetingEventDetails
{public DateTime StartTime { get; set; }
}public partial class MeetingEndEventDetails : MeetingEventDetails
{public DateTime EndTime { get; set; }
}public partial class MeetingEventDetails : MeetingDetailsBase
{public string MeetingType { get; set; }
}public partial class MeetingDetailsBase
{public string Id { get; set; }public Uri JoinUrl { get; set; }public string Title { get; set; }
}
上面是我從 teams sdk 源代碼里簡化出來的代碼。大家如果有興趣,可以查看這里:https://github.com/microsoft/botbuilder-dotnet/tree/main/libraries/Microsoft.Bot.Schema/Teams
從上面的結構里可以看到開始會議的事件里會包含 start time, meeting id, meeting type,join url, title,等信息。類似的結束會議的事件里包含了 end time。
看到這里,可能一些經常看我文章的同學會問,如果不用微軟官方的 teams sdk,自己來處理,是否可行,答案是肯定的。通過 ngrok,我們就可以發現 teams 調用我們 bot 的請求的 payload。對于一個開始會議的事件,我簡化后的payload 如下:
{ "name": "application/vnd.microsoft.meetingStart", "type": "event", "timestamp": "2021-04-29T16:10:41.1252256Z", // ..."channelData": {"meeting": {"id": "<會議的id>"}// ...},"value": {"MeetingType": "Scheduled","Title": "<你的會議標題>","Id": "<會議的id>","JoinUrl": "<會議的 url>","StartTime": "2021-04-29T16:17:17.4388966Z"},"locale": "en-US"
}
特別需要注意的是最前面的那個 name,表明了整個payload是一個 meetingStart 的格式。同樣,會議結束的 payload 如下:
{ "name": "application/vnd.microsoft.meetingEnd", "type": "event", "timestamp": "2021-04-29T16:10:41.1252256Z", // ..."channelData": {"meeting": {"id": "<會議的id>"}// ...},"value": {"MeetingType": "Scheduled","Title": "<你的會議標題>","Id": "<會議的id>","JoinUrl": "<會議的 url>","EndTime": "2021-04-29T16:17:17.4388966Z"},"locale": "en-US"
}
差別主要在與第一行的 name,和最后那個結構里的 EndTime。看到這里大家是否已經知道如何接受這兩個事件了?
最后,我們代碼完成后,我們還需要更新一下app的manifest.json。確保我們的app有足夠的權限來處理。使用我們最喜歡的編輯器打開 manifest 文件,加入如下的配置。
"webApplicationInfo": {"id": "你的 bot id","resource": "https://RscPermission",
},
"authorization": {"permissions": {"resourceSpecific": [{"name": "OnlineMeeting.ReadBasic.Chat","type": "Application"}] }
}
如果你當前的bot使用較老版本的manifest格式,可以用如下的manifest
"webApplicationInfo": {"id": "你的 bot id","resource": "https://RscPermission","applicationPermissions": ["OnlineMeeting.ReadBasic.Chat"]
}
可以看到最最關鍵的是我們的app需要有?OnlineMeeting.ReadBasic.Chat
?這個權限。
代碼和配置都準備好后,就可以開始調試運行了。