diff --git a/README.md b/README.md index bb07219..eb254d6 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,30 @@ -# TeamsBridge -Rocket.Chat app to support connecting collaborators across Rocket.Chat and Microsoft Teams +# Microsoft Teams Bridge -## Getting Started with Rocket.Chat App -Here are some commands to get started: -- `rc-apps package`: this command will generate a packaged app file (zip) which can be installed **if** it compiles with TypeScript -- `rc-apps deploy`: this will do what `package` does but will then ask you for your server url, username, and password to deploy it for you - -## Getting Started with TeamsBridge App -See [Support document](./docs/support.md) for how to use TeamsBridge App. +Rocket.Chat app to support connecting collaborators across Rocket.Chat and Microsoft Teams. Messages, files, and member updates are relayed in real time so that users on each platform can collaborate without leaving their preferred tool. ## Documentation -Here are some links to examples and documentation: -- [Rocket.Chat Apps TypeScript Definitions Documentation](https://rocketchat.github.io/Rocket.Chat.Apps-engine/) -- [Rocket.Chat Apps TypeScript Definitions Repository](https://github.com/RocketChat/Rocket.Chat.Apps-engine) + +| Guide | Description | +|-------|-------------| +| [Overview & Capabilities](./docs/capabilities.md) | What the app does, supported features, and architecture overview | +| [Setting Up the MS Teams Bridge](./docs/setup.md) | End-to-end admin guide — Azure registration, permissions, settings, and verification | +| [Creating a Bridged Room](./docs/bridged-rooms.md) | How to activate bridging and add Microsoft Teams users | +| [Slash Commands Reference](./docs/slash-commands.md) | Complete reference for all slash commands | +| [App Settings](./docs/settings.md) | Detailed explanation of every configurable setting | +| [FAQs](./docs/faq.md) | Frequently asked questions | +| [Troubleshooting](./docs/troubleshooting.md) | Common issues, root causes, and resolution steps | + +## Development + +### Commands + +- `rc-apps package` — Generate a packaged app file (zip) which can be installed if it compiles with TypeScript +- `rc-apps deploy` — Package and deploy; will prompt for your server URL, username, and password + +### Resources + +- [Rocket.Chat Apps Engine Documentation](https://rocketchat.github.io/Rocket.Chat.Apps-engine/) +- [Rocket.Chat Apps Engine Repository](https://github.com/RocketChat/Rocket.Chat.Apps-engine) - [Example Rocket.Chat Apps](https://github.com/graywolf336/RocketChatApps) - Community Forums - [App Requests](https://forums.rocket.chat/c/rocket-chat-apps/requests) diff --git a/docs/admin.md b/docs/admin.md deleted file mode 100644 index 1fa841c..0000000 --- a/docs/admin.md +++ /dev/null @@ -1,59 +0,0 @@ -# Organization Admin Guide - -## Setup the TeamsBridge App - -To enable Rocket.Chat and Microsoft Teams collaboration for your organization with TeamsBridge App, there are some actions required for the organization admin. Please make sure you have access for both your organization's `Rocket.Chat admin account` and `Microsoft Teams admin account`. - -### 1. Install the TeamsBridge App - -- On Rocket.Chat Marketplace, find the Teams Bridge App and install. -- Navigate to App Admin Page, scroll to APIs, and copy `GET auth endpoint URL`. This endpoint URL will be used in following steps. If it’s a localhost url, tunnel service such as Ngrok is required to expose the localhost port to the internet. - -### 2. Setup an Microsoft Entra ID App for your organization - -- Login to [Microsoft Azure Portal](portal.azure.com) with Microsoft Teams admin account of your organization. Find and select `Microsoft Entra ID` service with the search box. -- Select `Add` => `App registration`. -- Give your AAD App a name. Select `Accounts in this organizational directory only` for Supported account type. Select `Web` as Redirect URI type and paste `GET auth endpoint URL` (copied in previous step) of the TeamsBridge App here as value. Click Register to complete the registration. -- An AAD App will be created after a while. Copy `Application (client) ID` and `Directory (tenant) ID` showed on the Overview page. Those IDs will be used in following steps. Then, select `Certificates & Secret` blade. -- Select `New client secret`. Give the secret a meaningful name and click add. A client secret will be created. Copy the `Client Secret` value which will be used in following steps. -- Navigate to the `API permissions` blade. Select `Add a permission`, add the set of required permissions, and click `grant admin consent for org`. - - **TODO: YUQING - figure the minimum required permissions set and add a required permissions list here** - -### 3. Configure the TeamsBridge App - -- Navigate to the App Admin Page again, scroll to Settings. Paste `Directory (tenant) ID`, `Application (client) ID`, and `Client Secret` copied in previous step to corresponding box and click `Save changes`. - -### 4. Verify the TeamsBridge App setup correctly - -- You're almost there! Now run slash command `teamsbridge-setup-verification` to verify whether you setup the TeamsBridge App correctly for your organization. - -#### Trouble Shooting Guide - -If the slash command `teamsbridge-setup-verification` prompts nagative result, you can try the following steps. - -- Make sure in Rocket.Chat App Info Settings page you see the correct value for `Directory (tenant) ID`, `Application (client) ID`, and `Client Secret`. -- Make sure you gives all required permission on `Microsoft Azure Portal - Microsoft Entra ID - API permissions` blade. - -## Setup Microsoft Teams access for Rocket.Chat users in your organization - -Microsoft Teams data access is controlled by Microsoft Authorization policies. TeamsBridge App is a tool to centralize a user's access instead of extending their access. Rocket.Chat users will have to authorize the TeamsBridge App with their Microsoft Teams access in order to enable themselves collaborate with their colleagues on Microsoft Teams. People who use Microsoft Teams will be able to chat with Rocket.Chat users as if they were also on Microsoft Teams. Rocket.Chat users will be able to chat with Microsoft Teams people while staying in Rocket.Chat. - -Organization admin will have to grant Microsoft Teams access to Rocket.Chat users by providing Microsoft Teams accounts so that they can authorize the TeamsBridge App to start the collaboration. Both `Guest Access account` and `general Teams account` work for the TeamsBridge App. We highly recommand setting up `Guest Access account` for Rocket.Chat users who do not have a Teams account in the organization to minimize the cost. - -### Setup Guest Access account - -- `Guest Access account` grants `Guest Access` to someone who doesn't have a school or work account with the organization. For details, see [Guest access in Microsoft Teams](https://docs.microsoft.com/en-us/microsoftteams/guest-access). - -- Organization Admin need to make sure `Guest Access` is turned `ON` for the organization. For details, see [Teams guest access settings](https://docs.microsoft.com/en-us/microsoft-365/solutions/collaborate-as-team?view=o365-worldwide#teams-guest-access-settings). - -- Once the `Guest Access` is turned `ON`, organization Admin can invite guest to the organization. This can be done either via [Teams Admin Center](https://admin.teams.microsoft.com/) or [Azure Portal](https://portal.azure.com). For details, see [Teams Admin Center solution](https://support.microsoft.com/en-us/office/add-guests-to-a-team-in-teams-fccb4fa6-f864-4508-bdde-256e7384a14f?ui=en-us&rs=en-us&ad=us) and [Azure Portal solution](https://docs.microsoft.com/en-us/azure/active-directory/external-identities/b2b-quickstart-add-guest-users-portal). - -- `Guest Access` is available for limited Microsoft 365 subscription types. But the cost for a `Guest Access` is significantly lower than `general Teams account`, For details, see [Licensing for guest access](https://docs.microsoft.com/en-us/microsoftteams/guest-access#licensing-for-guest-access). - -### Setup general Teams account - -- To create a `general Teams account`, organization admin need to add a user via [Microsoft 365 Admin Center](https://admin.microsoft.com/Adminportal/Home#/homepage) with their Microsoft admin account. For details, see [Microsoft official document](https://docs.microsoft.com/en-us/microsoft-365/admin/add-users/add-new-employee?view=o365-worldwide). - -- Then, organization admin need to assign a Teams license to the newly created user. For details, see [Microsoft official document](https://docs.microsoft.com/en-us/microsoftteams/user-access#using-the-microsoft-365-admin-center). - -- The cost for a `general Teams account` depends on the plan your organization choose. For details, see [Microsoft official document](https://www.microsoft.com/en-us/microsoft-teams/compare-microsoft-teams-options?activetab=pivot%3aprimaryr1). diff --git a/docs/bridged-rooms.md b/docs/bridged-rooms.md new file mode 100644 index 0000000..ef5d87b --- /dev/null +++ b/docs/bridged-rooms.md @@ -0,0 +1,153 @@ +# Creating a Bridged Room + +A **bridged room** is a Rocket.Chat room that actively relays messages between Rocket.Chat and Microsoft Teams. This guide explains how to set one up and start cross-platform communication. + +--- + +## Prerequisites + +Before bridging a room, make sure the [initial setup](./setup.md) is complete: + +- ✅ App is installed and configured with Azure credentials +- ✅ API permissions are granted with admin consent +- ✅ App Bot User is logged in via `/teamsbridge-login-app-user` +- ✅ Setup verification passes (`/teamsbridge-setup-verification`) + +--- + +## Step 1 — Add the Bot to a Room + +To bridge a room, invite the App Bot User (e.g. `microsoftteamsbridge.bot`) as a member: + +1. Open the room you want to bridge. +2. Click the **Members** panel. +3. Click **Add Members** and search for `microsoftteamsbridge.bot` (or whatever the bot's username is). +4. Add the bot to the room. + +### What happens when the bot joins + +- The room is flagged as a **bridged room** (`isBridged = true`) +- A notification message is sent to the room confirming that bridging is active: + > *"Hey, I been added to this room. So the room is now an active bridge room and I will start relaying messages between Rocket.Chat and Microsoft Teams."* +- If the App Bot User does not have a valid token (Step 5 of setup not done), room members are notified to contact an admin + +### Supported Room Types + +| Room Type | Can Be Bridged? | +|-----------|:-----------:| +| Private channel | ✅ | +| Private team | ✅ | +| Private discussion | ✅ | +| Public channel | ❌ | +| Direct message | ❌ | + +### Deactivating a Bridge + +To stop bridging a room, simply **remove the App Bot User** from the room. The room will no longer relay messages. + +--- + +## Step 2 — Add Teams Users + +Once a room is bridged, you can add Microsoft Teams users to the linked Teams thread: + +### Using the Slash Command + +1. Open the bridged room. +2. Run: + ``` + /teamsbridge-add-user + ``` +3. A contextual bar (side panel) opens with a **live search** from the Azure AD directory. +4. Type a display name to search for Teams users. +5. Select one or more users from the results. +6. Click **"Add users"** to add them to the linked Teams chat. + +### Using the Room Action Button + +1. Open the bridged room. +2. Click the **kebab menu** (⋮) or room action menu. +3. Select **"Add Teams user"**. +4. The same contextual bar opens — search, select, and add users. + +> **Note:** If you attempt to add a user in a room that is **not bridged**, you will receive an error message: +> *"This room is not bridged to Microsoft Teams. To activate bridging, add me to this room."* + +--- + +## Step 3 — Start Messaging + +Once the room is bridged and Teams users have been added, messages flow automatically: + +- **RC → Teams:** Any message sent in the bridged room is relayed to the linked Teams chat. +- **Teams → RC:** Any message sent in the Teams chat is relayed back to the Rocket.Chat room. + +### How Messages Appear + +| Sender | Logged In? | Appears in Teams As | +|--------|:----------:|-------------------| +| RC user | Yes (via `/teamsbridge-login-teams`) | Their own Teams identity | +| RC user | No | App Bot User with a blockquote showing the sender's name | + +| Sender | Has Linked RC Account? | Appears in RC As | +|--------|:----------------------:|-----------------| +| Teams user | Yes | Their RC identity | +| Teams user | No | App Bot User with the Teams user's display name as alias | + +--- + +## Optional: Individual User Login + +Individual Rocket.Chat users can **optionally** link their personal Microsoft Teams account for identity-preserved messaging: + +1. Run the slash command in any room: + ``` + /teamsbridge-login-teams + ``` +2. Click the **"Login Teams"** button in the message. +3. Complete the Microsoft OAuth login in the browser. + +### Benefits of Logging In + +- Messages appear under the user's **own Teams identity** instead of the bot's +- Direct identity preservation in both directions + +### Without Logging In + +- Messages are **still bridged** — they are relayed through the App Bot User +- In Teams, the message appears with a **[Bridged Message]** header and the sender's display name in a blockquote +- This is perfectly functional and is the default experience for most users + +--- + +## Viewing Teams Members + +To see which Microsoft Teams users are currently in the linked Teams chat: + +### Using the Slash Command + +``` +/teamsbridge-view-members +``` + +### Using the Room Action Button + +1. Click the kebab menu (⋮) in the bridged room. +2. Select **"View Teams members"**. + +A contextual bar opens listing all members of the linked Teams thread. + +--- + +## Checking Bridge Status + +To verify whether the current room is actively bridged: + +``` +/teamsbridge-status +``` + +| Response | Meaning | +|----------|---------| +| ✅ *"This room is bridged to Microsoft Teams…"* | Room is actively bridged | +| ❌ *"This room is not bridged to Microsoft Teams…"* | Bot is not in the room — add it to activate bridging | diff --git a/docs/capabilities.md b/docs/capabilities.md new file mode 100644 index 0000000..c1ca7ea --- /dev/null +++ b/docs/capabilities.md @@ -0,0 +1,138 @@ +# Overview & App Capabilities + +## What Is the Microsoft Teams Bridge? + +The Microsoft Teams Bridge is a Rocket.Chat app that connects Rocket.Chat rooms with Microsoft Teams chats, enabling real-time cross-platform collaboration. Users on either platform can send and receive messages without switching tools. + +--- + +## Key Concepts + +Before diving in, it helps to understand the terminology used throughout the documentation. + +| Term | Definition | +|------|-----------| +| **App Bot User** | A single system-level Rocket.Chat user (e.g. `microsoftteamsbridge.bot`) created automatically when the app is installed. This is the only bot account used by the bridge — there is **no** per-Teams-user bot. It acts as the relay identity for all bridged messages. | +| **App Bot User's Linked Teams Account** | The Microsoft Teams account the App Bot User is logged into via OAuth. Also referred to as the **Bridge User**. An admin completes this login via `/teamsbridge-login-app-user`. | +| **Bridged Room** | A Rocket.Chat room where the App Bot User has been added as a member. Only bridged rooms relay messages between Rocket.Chat and Microsoft Teams. A room becomes bridged when the bot joins, and stops being bridged when the bot leaves. | +| **Logged-in RC User** | A Rocket.Chat user who has optionally linked their personal Microsoft Teams account using `/teamsbridge-login-teams`. | +| **Non-logged-in RC User** | A Rocket.Chat user who has **not** linked a personal Teams account. Their messages are still bridged — they are relayed through the App Bot User's linked Teams account using a rich blockquote format that includes their display name. | +| **Teams Thread** | The Microsoft Teams chat (group or 1:1) linked to a Rocket.Chat bridged room. Created automatically when the first message is sent or when a Teams user is added. | + +--- + +## Supported Features + +### Message Relay + +| Feature | Status | +|---------|--------| +| Text messages (RC → Teams) | ✅ Supported | +| Text messages (Teams → RC) | ✅ Supported | +| Emoji rendering | ✅ Supported | +| URL link parsing & preview | ✅ Supported | +| Rich text / Markdown formatting | ✅ Supported | +| Message edits (RC → Teams) | ✅ Supported | +| Message edits (Teams → RC) | ✅ Supported | +| Message deletions (RC → Teams) | ✅ Supported | +| Message deletions (Teams → RC) | ✅ Supported | + +### File Sharing + +| Feature | Status | +|---------|--------| +| File uploads (RC → Teams via OneDrive) | ✅ Supported | +| File downloads (Teams → RC) | ✅ Supported | + +### Member Management + +| Feature | Status | +|---------|--------| +| Add Teams users to a bridged room | ✅ Supported | +| View Teams members in a linked chat | ✅ Supported | +| Live search of Azure AD directory | ✅ Supported | +| Automatic member sync on room join/leave | ✅ Supported | + +### Identity & Authentication + +| Feature | Status | +|---------|--------| +| OAuth2 login for the App Bot User | ✅ Supported | +| OAuth2 login for individual RC users | ✅ Supported (optional) | +| Identity-preserved messaging (logged-in users) | ✅ Supported | +| Bridged message format (non-logged-in users) | ✅ Supported | +| Automatic token refresh | ✅ Supported | +| Webhook subscription auto-renewal | ✅ Supported | + +### Room Types + +| Room Type | Supported | +|-----------|-----------| +| Private channels | ✅ Yes | +| Private teams | ✅ Yes | +| Private discussions | ✅ Yes | +| Public channels | ❌ No | +| Direct messages | ❌ No | + +--- + +## How Message Relay Works + +Understanding the message flow is key to understanding why individual user login is **optional**. + +### Outbound (Rocket.Chat → Microsoft Teams) + +``` +RC user sends a message in a bridged room + │ + ├─ Is the RC user logged in to Teams? (/teamsbridge-login-teams) + │ │ + │ ├─ YES → Message is sent via the user's own Teams token + │ │ (appears in Teams under their true identity) + │ │ + │ └─ NO → Is the App Bot User logged in? (/teamsbridge-login-app-user) + │ │ + │ ├─ YES → Message is relayed via the App Bot User's token + │ │ (appears in Teams using a rich blockquote format + │ │ with the sender's display name) + │ │ + │ └─ NO → Message is NOT relayed to Teams + │ (room members are notified that admin login is required) +``` + +### Inbound (Microsoft Teams → Rocket.Chat) + +``` +Teams user sends a message in a linked Teams thread + │ + ├─ Is the App Bot User logged in & webhook subscription active? + │ │ + │ ├─ NO → Messages are NOT received by Rocket.Chat + │ │ + │ └─ YES → Message is processed by the bridge + │ │ + │ └─ Does this Teams user have a linked RC account? + │ │ + │ ├─ YES → Message appears in RC under their true RC identity + │ │ + │ └─ NO → Message appears in RC from the App Bot User + │ (using the Teams user's display name as a message alias) +``` + +> **Key takeaway:** Individual RC users do **not** need to log in for the bridge to function. If they are not logged in, their messages are relayed through the App Bot User's linked Teams account using a rich blockquote format that carries their name. Logging in is optional and provides the benefit of messages appearing under their own Teams identity. + +--- + +## Architecture Overview + +The app is built on the Rocket.Chat Apps Engine and uses the following components: + +| Component | Purpose | +|-----------|---------| +| **OAuth2 Authentication** | Handles delegated and app-level token flows against Microsoft Entra ID | +| **Microsoft Graph API** | All read/write operations — messages, chats, members, subscriptions | +| **Webhook Subscriptions** | Receives real-time notifications from Teams via Microsoft Graph change notifications | +| **Scheduled Jobs** | Auto-renews tokens and subscriptions, cleans up stale data | +| **Slash Commands** | User-facing commands for login, setup, status, and management | +| **UI Action Buttons** | Context menu buttons for adding Teams users and viewing members | +| **Persistence Layer** | Stores user mappings, room mappings, message mappings, and token data | diff --git a/docs/faq.md b/docs/faq.md new file mode 100644 index 0000000..576dc61 --- /dev/null +++ b/docs/faq.md @@ -0,0 +1,110 @@ +# Frequently Asked Questions + +## General + +### What is the Microsoft Teams Bridge? + +The Microsoft Teams Bridge is a Rocket.Chat app that enables real-time cross-platform communication between Rocket.Chat and Microsoft Teams. Messages, files, and member updates are relayed bidirectionally so users on each platform can collaborate without switching tools. + +### Do all Rocket.Chat users need to log in to Microsoft Teams? + +**No.** Individual user login is completely **optional**. The bridge works through a single App Bot User that relays messages for everyone. If a user has not logged in, their messages still appear in Teams — they are sent via the bot using a rich blockquote format that includes the user's display name. + +Logging in via `/teamsbridge-login-teams` is only needed if a user wants their messages to appear under their **own** Teams identity. + +### What Microsoft 365 license is needed? + +The bridge requires at least one Microsoft 365 account with Microsoft Teams access to serve as the App Bot User. For individual users who want identity-preserved messaging, each would need their own Microsoft 365 account (either a full account or Guest Access). + +### Does the bridge support public channels? + +No. Only **private channels**, **private teams**, and **private discussions** can be bridged. Public channels and direct messages are not supported. + +--- + +## Setup + +### What permissions does the Azure app need? + +See the [Setup Guide — Step 3](./setup.md#step-3--configure-api-permissions) for the full list. Key delegated permissions include `chat.readwrite`, `chatmessage.send`, and `files.readwrite`. The main application permission is `user.read.all`. + +### Why do I need to run `/teamsbridge-login-app-user`? + +This command generates a delegated OAuth2 token for the App Bot User. Without this token, the bridge can **read** from Azure AD (for user search) but cannot **write** — it cannot send messages, add members, or manage webhook subscriptions. + +### Can I change the Teams account used by the bot? + +Yes. Run `/teamsbridge-logout-app-user` to log out the current account, then run `/teamsbridge-login-app-user` and log in with a different Teams account. + +### What happens if my client secret expires? + +The bridge will stop working. You will need to: +1. Create a new client secret in the Azure Portal +2. Update the **Microsoft Entra Client Secret** setting in the app +3. Save changes + +--- + +## Bridged Rooms + +### How do I bridge a room? + +Add the App Bot User (e.g. `microsoftteamsbridge.bot`) as a member of the room. See [Creating a Bridged Room](./bridged-rooms.md) for details. + +### How do I un-bridge a room? + +Remove the App Bot User from the room. The room will stop relaying messages immediately. + +### Why can't I bridge a public channel or DM? + +This is by design. The bridge only supports private channels, private teams, and private discussions. This ensures controlled access to the cross-platform communication. + +### When is the Teams thread created? + +A Teams thread is created automatically when the first message is sent in a bridged room or when the first Teams user is added. + +--- + +## Messaging + +### Why aren't my messages appearing in Teams? + +Check the following in order: +1. Is the room **bridged**? Run `/teamsbridge-status` to verify. +2. Is the App Bot User **logged in**? Run `/teamsbridge-setup-verification`. +3. Are **API permissions** correctly configured and granted in Azure? + +### Why don't inbound messages from Teams appear in RC? + +1. Verify the App Bot User is logged in +2. Run `/teamsbridge-resubscribe-messages` to re-register webhook subscriptions +3. Check that the Rocket.Chat instance is accessible from the internet (Microsoft Graph must reach the webhook endpoint) + +### What message types are supported? + +Text messages, rich text/markdown, emoji, URLs, file attachments, message edits, and message deletions are all supported in both directions. + +### What does the "[Bridged Message]" format look like? + +When a non-logged-in RC user sends a message, it appears in Teams as: + +> **[Bridged Message]** +> > **John Doe** +> > --- +> > Hello from Rocket.Chat! + +--- + +## Authentication + +### Is OAuth data stored securely? + +Yes. Access tokens and refresh tokens are stored in the Rocket.Chat Apps Engine's persistence layer. Tokens are automatically refreshed before expiration and stale OAuth nonces are periodically cleaned up. + +### How often are tokens refreshed? + +The app runs a scheduled job every **30 minutes** to renew access tokens and webhook subscriptions for all registered users. + +### Can I use Guest Access accounts? + +Yes. Microsoft Teams Guest Access accounts work with the bridge. This can be a more cost-effective option for organizations where Rocket.Chat users don't have full Microsoft 365 licenses. See [Microsoft's Guest Access documentation](https://docs.microsoft.com/en-us/microsoftteams/guest-access) for details. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..3c10aaa --- /dev/null +++ b/docs/index.md @@ -0,0 +1,23 @@ +# Microsoft Teams Bridge — Documentation + +The Microsoft Teams Bridge app enables seamless cross-platform communication between Rocket.Chat and Microsoft Teams. Messages, files, and member updates are relayed in real time so that users on each platform can collaborate without leaving their preferred tool. + +## Table of Contents + +| # | Section | Description | +|---|---------|-------------| +| 1 | [Overview & Capabilities](./capabilities.md) | What the app does, supported features, and architecture overview | +| 2 | [Setting Up the MS Teams Bridge](./setup.md) | End-to-end admin guide — Azure registration, permissions, settings, and verification | +| 3 | [Creating a Bridged Room](./bridged-rooms.md) | How to activate bridging in a room and add Microsoft Teams users | +| 4 | [Slash Commands Reference](./slash-commands.md) | Complete reference for all slash commands with usage and examples | +| 5 | [App Settings](./settings.md) | Detailed explanation of every configurable setting | +| 6 | [FAQs](./faq.md) | Frequently asked questions | +| 7 | [Troubleshooting](./troubleshooting.md) | Common issues, root causes, and resolution steps | + +--- + +## Quick Links + +- **Admins** — Start with the [Setup Guide](./setup.md), then configure [Settings](./settings.md). +- **Users** — Learn about [Bridged Rooms](./bridged-rooms.md) and [Slash Commands](./slash-commands.md). +- **Having issues?** — Check the [Troubleshooting](./troubleshooting.md) guide or browse the [FAQs](./faq.md). diff --git a/docs/settings.md b/docs/settings.md new file mode 100644 index 0000000..55976d1 --- /dev/null +++ b/docs/settings.md @@ -0,0 +1,81 @@ +# App Settings + +The Microsoft Teams Bridge has four configurable settings, accessible via **Administration → Apps → Microsoft Teams Bridge → Settings** in Rocket.Chat. + +--- + +## Settings Reference + +### Microsoft Entra Directory (tenant) ID + +| Property | Value | +|----------|-------| +| **Setting ID** | `teamsbridge_aad_tenant_id` | +| **Type** | String | +| **Required** | Yes | +| **Default** | *(empty)* | + +The **Directory (tenant) ID** from your Microsoft Entra ID app registration. Found on the app's **Overview** page in the Azure Portal. + +This identifies your Microsoft 365 organization/tenant and is used to construct OAuth2 authorization and token endpoints. + +--- + +### Microsoft Entra Application (client) ID + +| Property | Value | +|----------|-------| +| **Setting ID** | `teamsbridge_aad_client_id` | +| **Type** | String | +| **Required** | Yes | +| **Default** | *(empty)* | + +The **Application (client) ID** from your Microsoft Entra ID app registration. Found on the app's **Overview** page in the Azure Portal. + +This uniquely identifies the registered application and is used in all OAuth2 flows. + +--- + +### Microsoft Entra Client Secret + +| Property | Value | +|----------|-------| +| **Setting ID** | `teamsbridge_aad_client_secret` | +| **Type** | String | +| **Required** | Yes | +| **Default** | *(empty)* | + +The **Client Secret** value from your Microsoft Entra ID app registration. Found under **Certificates & Secrets** in the Azure Portal. + +> **Important:** Copy the secret **value** (not the Secret ID) immediately after creation — Azure will not show it again. + +> **Warning:** Client secrets have an expiration date. When a secret expires, the bridge will stop working. Create a new secret and update this setting before the current one expires. + +--- + +### Proxy URL + +| Property | Value | +|----------|-------| +| **Setting ID** | `teamsbridge_proxy_url` | +| **Type** | String | +| **Required** | No | +| **Default** | *(empty)* | + +An optional publicly accessible URL to be used as a proxy if Rocket.Chat is not directly accessible from the internet. This URL replaces the Site URL during webhook registration with Microsoft Teams. + +**When to use:** If your Rocket.Chat instance is behind a firewall, NAT, or reverse proxy and Microsoft Graph cannot reach it directly for webhook notifications. + +**Example:** `https://proxy.mycompany.com` + +--- + +## Where to Find These Values + +1. Sign in to the [Azure Portal](https://portal.azure.com) +2. Navigate to **Microsoft Entra ID → App registrations** +3. Select your registered app +4. **Tenant ID** and **Client ID** are on the **Overview** page +5. **Client Secret** is under **Certificates & Secrets** (you'll need to create one if you haven't already) + +For step-by-step instructions, see the [Setup Guide](./setup.md). diff --git a/docs/setup.md b/docs/setup.md new file mode 100644 index 0000000..2895d33 --- /dev/null +++ b/docs/setup.md @@ -0,0 +1,150 @@ +# Setting Up the Microsoft Teams Bridge + +This guide walks a Rocket.Chat administrator through the complete setup process. All steps must be completed **in order**. + +--- + +## Prerequisites + +- **Rocket.Chat admin account** with `manage-apps` permission +- **Microsoft Teams admin account** (or an account with permission to register apps in [Microsoft Entra ID](https://entra.microsoft.com)) +- A publicly accessible Rocket.Chat instance URL (or a tunnel service such as [Ngrok](https://ngrok.com) if running locally) + +--- + +## Step 1 — Install the App + +1. Navigate to **Administration → Marketplace** in Rocket.Chat. +2. Search for **Microsoft Teams Bridge** and install the app. +3. After installation, go to the app's **Info** page and scroll down to the **APIs** section. +4. Copy the **`GET auth` endpoint URL** — you will need it in the next step. + +> **Note:** If your Rocket.Chat instance is running on `localhost`, you must use a tunnel service like Ngrok to expose the port to the internet. Microsoft Entra ID needs to reach this URL during the OAuth callback. + +--- + +## Step 2 — Register an App in Microsoft Entra ID + +1. Sign in to the [Microsoft Azure Portal](https://portal.azure.com) with your Microsoft Teams admin account. +2. Search for and open **Microsoft Entra ID**. +3. Navigate to **App registrations → New registration**. +4. Fill in the registration form: + - **Name:** Choose a descriptive name (e.g. `Rocket.Chat Teams Bridge`) + - **Supported account types:** Select **"Accounts in this organizational directory only"** + - **Redirect URI:** + - **Platform:** Web + - **URI:** Paste the `GET auth` endpoint URL copied in Step 1 +5. Click **Register**. +6. On the app's **Overview** page, copy: + - **Application (client) ID** + - **Directory (tenant) ID** +7. Navigate to **Certificates & Secrets → New client secret**: + - Give it a meaningful description + - Choose an expiration period + - Click **Add** and **immediately copy the secret value** (it will not be shown again) + +--- + +## Step 3 — Configure API Permissions + +Navigate to **API permissions** in the Azure app registration and add the following Microsoft Graph permissions: + +### Delegated Permissions + +These are requested during the OAuth consent flow. You must add **all** of them — some are used by the normal user login and some by the App Bot User login. + +| Permission | Used By | Required For | +|------------|---------|-------------| +| `offline_access` | Both | Refresh token support | +| `openid` | Normal user | OpenID Connect authentication | +| `user.read` | Both | Reading the logged-in user's profile | +| `user.read.all` | Bot user | Searching users in the Azure AD directory | +| `chat.create` | Bot user | Creating new Teams chat threads | +| `chat.readwrite` | Both | Reading and writing to chats | +| `chat.readbasic` | Both | Reading basic chat metadata | +| `chatmember.read` | Bot user | Reading chat member lists | +| `chatmember.readwrite` | Bot user | Adding/removing members from Teams chats | +| `chatmessage.read` | Both | Reading chat messages | +| `chatmessage.send` | Both | Sending chat messages | +| `files.readwrite` | Both | Uploading/downloading files via OneDrive | + +### Application Permissions + +| Permission | Required For | +|------------|-------------| +| `user.read.all` | Searching users in the Azure AD directory | +| `chat.create` | Creating Teams chat threads | +| `chat.readbasic.all` | Reading basic metadata for all chats | +| `chat.readwrite.all` | Reading and writing all chats | +| `chatmember.read.all` | Reading members of all chats | +| `chatmember.readwrite.all` | Adding/removing members in all chats | +| `chatmessage.read.all` | Reading messages in all chats (webhook notifications) | +| `files.read.all` | Downloading shared files from Teams | + +> **Important:** After adding all permissions, click **"Grant admin consent for \"** to approve them. All permissions must show a green **"Granted"** status. The OAuth consent screen will **reject** any scope that is not registered in the app registration. + +--- + +## Step 4 — Configure App Settings + +1. In Rocket.Chat, navigate to **Administration → Apps → Microsoft Teams Bridge → Settings**. +2. Fill in the following fields using values from Step 2: + +| Setting | Value | +|---------|-------| +| **Microsoft Entra Directory (tenant) ID** | The `Directory (tenant) ID` from Azure | +| **Microsoft Entra Application (client) ID** | The `Application (client) ID` from Azure | +| **Microsoft Entra Client Secret** | The client secret value from Azure | +| **Proxy URL** *(optional)* | A publicly accessible URL to use as a proxy if Rocket.Chat is behind a firewall | + +3. Click **Save changes**. + +For full details on each setting, see the [Settings Reference](./settings.md). + +--- + +## Step 5 — Log In the App Bot User + +This is the most critical setup step. Without it, the bridge **cannot write** to Microsoft Teams. + +1. Open any Rocket.Chat room. +2. Run the slash command: + ``` + /teamsbridge-login-app-user + ``` +3. You will receive a message with a **"Login Teams"** button. Click it. +4. A Microsoft login page will open in your browser. Sign in with the Teams account you want the bot to use as its relay identity. +5. Approve the requested permissions when prompted. +6. If successful, the browser will display: **"Login to Teams succeed! You can close this window now."** + +> **Who should run this?** Only an admin with `manage-apps` permission. +> +> **What does this do?** It generates a delegated OAuth2 access token and stores it under the App Bot User's identity. This token is used for all relay operations — sending messages on behalf of non-logged-in users, adding members to Teams threads, and managing webhook subscriptions. + +--- + +## Step 6 — Verify the Setup + +Run the verification command to confirm everything is configured correctly: + +``` +/teamsbridge-setup-verification +``` + +### Expected Results + +| Result | Meaning | +|--------|---------| +| **"TeamsBridge app setup verification PASSED!"** | ✅ Everything is working — Azure connection and bot login are both verified. | +| **"Azure AD connection is verified, but the App Bot User is not logged into Teams…"** | ⚠️ Azure credentials are correct, but Step 5 was not completed. Run `/teamsbridge-login-app-user`. | +| **"TeamsBridge app setup verification FAILED!"** | ❌ Azure credentials are incorrect. Double-check Tenant ID, Client ID, and Client Secret. | + +--- + +## What's Next? + +Once setup is complete, you can: + +1. **[Create a bridged room](./bridged-rooms.md)** — Add the bot to a room to start relaying messages. +2. **[Set up individual user login](./bridged-rooms.md#optional-individual-user-login)** — Optional step for identity-preserved messaging. +3. **[Explore slash commands](./slash-commands.md)** — See all available commands. diff --git a/docs/slash-commands.md b/docs/slash-commands.md new file mode 100644 index 0000000..337c8c0 --- /dev/null +++ b/docs/slash-commands.md @@ -0,0 +1,137 @@ +# Slash Commands Reference + +The Microsoft Teams Bridge provides slash commands for setup, authentication, room management, and diagnostics. All are prefixed with `/teamsbridge-`. + +--- + +## Command Summary + +| Command | Who Can Run | Purpose | +|---------|:-----------:|---------| +| `/teamsbridge-setup-verification` | Admin | Verify Azure + bot token configuration | +| `/teamsbridge-login-app-user` | Admin | Log in the App Bot User to Teams | +| `/teamsbridge-logout-app-user` | Admin | Log out the App Bot User from Teams | +| `/teamsbridge-login-teams` | Any user | Link your personal Teams account | +| `/teamsbridge-logout-teams` | Any user | Unlink your personal Teams account | +| `/teamsbridge-add-user` | Any user | Add Teams users to a bridged room | +| `/teamsbridge-view-members` | Any user | View Teams members in linked chat | +| `/teamsbridge-status` | Any user | Check if room is bridged | +| `/teamsbridge-resubscribe-messages` | Admin | Re-register webhook subscriptions | + +--- + +## Admin Commands + +### `/teamsbridge-setup-verification` + +**Permission:** `manage-apps` + +Verifies the Azure AD connection and checks whether the App Bot User has a valid access token. + +**What it checks:** +1. Obtains an application token using Tenant ID, Client ID, and Client Secret +2. Checks if the App Bot User has a valid delegated token +3. Verifies the token by calling Microsoft Graph `GET /me` + +**Outputs:** + +| Output | Meaning | +|--------|---------| +| *"...verification PASSED!"* | ✅ Azure credentials and bot login are valid | +| *"Azure AD connection is verified, but the App Bot User is not logged in…"* | ⚠️ Run `/teamsbridge-login-app-user` | +| *"...verification FAILED!"* | ❌ Check Tenant ID, Client ID, or Client Secret | + +--- + +### `/teamsbridge-login-app-user` + +**Permission:** `manage-apps` + `admin` role + +Generates an OAuth2 login URL for the App Bot User. Required during initial setup — without this, the bridge **cannot relay messages**. + +- If already logged in → *"No need to login again."* +- If not → displays a **"Login Teams"** button + +--- + +### `/teamsbridge-logout-app-user` + +**Permission:** `manage-apps` + `admin` role + +Logs out the App Bot User — revokes tokens, deletes subscriptions, clears mappings. + +> **Warning:** The bridge stops relaying messages until you run `/teamsbridge-login-app-user` again. + +--- + +### `/teamsbridge-resubscribe-messages` + +**Permission:** `manage-apps` + `admin` role + +Re-registers webhook subscriptions with Microsoft Graph. Run this if inbound messages (Teams → RC) stop arriving. + +- If bot not logged in → prompts you to log in first +- If logged in → re-subscribes and confirms success + +--- + +## User Commands + +### `/teamsbridge-login-teams` + +**Permission:** Any user + +Links your personal Microsoft Teams account via OAuth2. **Optional** — provides identity-preserved messaging. + +- If already logged in → *"No need to login again."* +- If not → displays a **"Login Teams"** button + +**After logging in:** Messages appear under your own Teams identity instead of the bot's. + +--- + +### `/teamsbridge-logout-teams` + +**Permission:** Any user + +Unlinks your personal Teams account. Your messages will still be relayed via the bot's bridged message format. + +--- + +### `/teamsbridge-add-user` + +**Permission:** Any user + +Opens a contextual bar with live search from the Azure AD directory to add Teams users to the linked Teams chat. + +**Requirements:** +- Room must be **bridged** (bot is a member) +- Room must be a **private channel, private team, or private discussion** + +**Errors:** + +| Error | Cause | +|-------|-------| +| *"This room is not bridged…"* | Bot not in room | +| *"Adding a Teams Bot user only supported for private channels…"* | Wrong room type | + +--- + +### `/teamsbridge-view-members` + +**Permission:** Any user + +Opens a contextual bar showing all members of the linked Microsoft Teams chat. Same room type requirements as `/teamsbridge-add-user`. + +--- + +### `/teamsbridge-status` + +**Permission:** Any user + +Checks if the current room is bridged. + +| Output | Meaning | +|--------|---------| +| ✅ *"This room is **bridged**…"* | Active | +| ❌ *"This room is **not bridged**…"* | Bot not in room | diff --git a/docs/support.md b/docs/support.md deleted file mode 100644 index 8a0fcee..0000000 --- a/docs/support.md +++ /dev/null @@ -1,11 +0,0 @@ -# Rocket.Chat TeamsBridge App - -Rocket.Chat TeamsBridge App is a tool to support connecting collaborators across Rocket.Chat and Microsoft Teams. - -## As an organization Admin - -To enable Rocket.Chat and Microsoft Teams collaboration for your organization with TeamsBridge App, see [Organization Admin Guide](./admin.md). - -## As a Rocket.Chat user - -To start Rocket.Chat and Microsoft Teams cross platform collaboration, see [Rocket.Chat User Guide](./user.md). diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md new file mode 100644 index 0000000..7382806 --- /dev/null +++ b/docs/troubleshooting.md @@ -0,0 +1,187 @@ +# Troubleshooting + +This guide covers common issues encountered when setting up or using the Microsoft Teams Bridge, along with their root causes and solutions. + +--- + +## Setup Issues + +### Setup verification fails + +**Symptom:** `/teamsbridge-setup-verification` returns *"FAILED"*. + +**Root cause:** The Azure credentials (Tenant ID, Client ID, or Client Secret) are incorrect or the API permissions are not properly configured. + +**Solution:** +1. Navigate to **Administration → Apps → Microsoft Teams Bridge → Settings** +2. Verify each value matches what is shown in the Azure Portal: + - **Tenant ID** → Azure app **Overview → Directory (tenant) ID** + - **Client ID** → Azure app **Overview → Application (client) ID** + - **Client Secret** → Azure app **Certificates & Secrets → Value** (not the Secret ID) +3. In Azure, verify that all required API permissions have **admin consent granted** (green checkmark) +4. Run `/teamsbridge-setup-verification` again + +--- + +### "App Bot User is not logged into Teams" + +**Symptom:** Setup verification shows the Azure connection works but the bot is not logged in. + +**Root cause:** The admin has not completed `/teamsbridge-login-app-user`. + +**Solution:** +1. Run `/teamsbridge-login-app-user` in any Rocket.Chat room +2. Click the **"Login Teams"** button +3. Complete the OAuth login in the browser +4. Run `/teamsbridge-setup-verification` to confirm + +--- + +### OAuth callback fails or shows an error + +**Symptom:** After clicking "Login Teams", the browser shows an error instead of a success message. + +**Possible causes & solutions:** + +| Cause | Solution | +|-------|----------| +| Redirect URI mismatch | Ensure the redirect URI in Azure matches the app's `GET auth` endpoint URL exactly | +| Rocket.Chat not accessible | If running locally, use a tunnel service (e.g. Ngrok) and update the Proxy URL setting | +| Permissions not consented | Go to Azure **API permissions** and click **Grant admin consent** | +| Client secret expired | Create a new secret in Azure and update the app setting | + +--- + +## Messaging Issues + +### Messages not relaying from RC to Teams + +**Symptom:** Messages sent in a bridged Rocket.Chat room do not appear in Microsoft Teams. + +**Diagnostic steps:** + +1. **Check bridge status:** Run `/teamsbridge-status` + - If ❌ → Add the App Bot User to the room +2. **Check bot login:** Run `/teamsbridge-setup-verification` + - If ⚠️ → Run `/teamsbridge-login-app-user` +3. **Check room type:** Only private channels, private teams, and private discussions are supported +4. **Check app logs:** Navigate to **Administration → Apps → Microsoft Teams Bridge → Logs** for errors + +--- + +### Messages not arriving from Teams to RC + +**Symptom:** Messages sent in the linked Teams chat do not appear in Rocket.Chat. + +**Root cause:** Webhook subscriptions may have expired or failed. + +**Solution:** +1. Verify the App Bot User is logged in (`/teamsbridge-setup-verification`) +2. Run `/teamsbridge-resubscribe-messages` to re-register webhooks +3. Verify your Rocket.Chat instance is accessible from the internet + - Microsoft Graph needs to reach the webhook endpoint + - If using a tunnel service, ensure it is running + - If behind a firewall, configure the **Proxy URL** setting + +--- + +### "success: true" in logs but nothing happens + +**Symptom:** App logs show `{"success": true}` but no visible effect (user not added, message not sent). + +**Root cause:** The `success: true` response is from the Rocket.Chat Apps Engine confirming the **handler method ran without crashing** — it does **not** mean the Microsoft Teams API call succeeded. The actual operation likely failed silently because: +- The App Bot User has no token (`/teamsbridge-login-app-user` not run) +- The room is not bridged (bot not in room) + +**Solution:** Complete the missing setup steps and try again. + +--- + +## Room & Member Issues + +### "This room is not bridged to Microsoft Teams" + +**Symptom:** Slash commands or action buttons show this error. + +**Root cause:** The App Bot User is not a member of the room. + +**Solution:** Add `microsoftteamsbridge.bot` (or whatever the bot username is) to the room. + +--- + +### Teams user not added after clicking "Add users" + +**Symptom:** The modal closes after clicking "Add users" but the Teams user does not appear in the room. + +**Possible causes:** +1. The room is not bridged → add the bot to the room first +2. The App Bot User is not logged in → run `/teamsbridge-login-app-user` +3. The Teams user already exists in the linked chat + +**Diagnostic:** Check **Administration → Apps → Microsoft Teams Bridge → Logs** for detailed error output. + +--- + +### "Adding a Teams Bot user only supported for private channels…" + +**Symptom:** Error when running `/teamsbridge-add-user` or clicking "Add Teams user". + +**Root cause:** You're in a public channel or direct message. + +**Solution:** Switch to a private channel, private team, or private discussion. + +--- + +## Token & Subscription Issues + +### Client secret expired + +**Symptom:** The bridge stops working entirely — setup verification fails. + +**Solution:** +1. Go to Azure Portal → your app → **Certificates & Secrets** +2. Create a new client secret +3. Copy the value immediately +4. Update the **Microsoft Entra Client Secret** setting in the app +5. Save changes and run `/teamsbridge-setup-verification` + +--- + +### Webhook subscriptions expired + +**Symptom:** Outbound messages (RC → Teams) work, but inbound messages (Teams → RC) stop arriving. + +**Root cause:** Microsoft Graph webhook subscriptions expire after a maximum of 1 hour. The app auto-renews them every 30 minutes, but this can fail if the bot's token becomes invalid. + +**Solution:** +1. Verify the bot is logged in: `/teamsbridge-setup-verification` +2. Re-register subscriptions: `/teamsbridge-resubscribe-messages` + +--- + +### Infinite retry loop / HTTP 412 errors + +**Symptom:** The Rocket.Chat server becomes unresponsive and logs show repeated HTTP 412 errors. + +**Root cause:** The app is attempting operations (adding users, managing subscriptions) without a valid bot token, causing the request to fail and retry indefinitely. + +**Solution:** +1. Restart the Rocket.Chat server if it is unresponsive +2. Complete all setup steps — especially `/teamsbridge-login-app-user` +3. Verify with `/teamsbridge-setup-verification` + +--- + +## Quick Diagnostic Checklist + +When something isn't working, run through this checklist: + +| # | Check | Command | +|---|-------|---------| +| 1 | Is the room bridged? | `/teamsbridge-status` | +| 2 | Is setup correct? | `/teamsbridge-setup-verification` | +| 3 | Is the bot logged in? | `/teamsbridge-setup-verification` (check output) | +| 4 | Are webhooks active? | `/teamsbridge-resubscribe-messages` | +| 5 | Is RC accessible from internet? | Check Proxy URL setting or tunnel service | +| 6 | Is the client secret valid? | Check expiration in Azure Portal | +| 7 | Check app logs | **Administration → Apps → Logs** | diff --git a/docs/user.md b/docs/user.md deleted file mode 100644 index 741d061..0000000 --- a/docs/user.md +++ /dev/null @@ -1,50 +0,0 @@ -# Rocket.Chat User Guide - -## Embedded login - -Microsoft Teams data access is controlled by Microsoft Authorization policies. Without your authorization, no one could access your Teams data or send/receive messages on-behalf-of you. In order to enable yourself collaborate with your colleagues on Microsoft Teams, you'll have to login to your Microsoft Teams account to authorize the TeamsBridge App to relay your message back and forth. Your colleagues who use Microsoft Teams will be able to chat with you as if you were also on Microsoft Teams. You'll be able to chat with them while staying in Rocket.Chat. - -The required action for you to authorize the TeamsBridge App is called `Embedded Login`. You need to follow the following steps. - -### 1. Make sure you have a Teams account or a Guess Account of your organization - -- If you don't yet have a Teams account or a Guess Account of your organization, contact your organization admin to let them create one for you. - -### 2. Get the Embedded Login link for your Rocket.Chat account - -- Run the slash command `teamsbridge-login-teams` in Rocket.Chat. -- You will receive a message 'To start cross platform collaboration, you need to login to Microsoft with your Teams account or guest account You'll be able to keep using Rocket.Chat, but you'll also be able to chat with colleagues using Microsoft Teams. Login Teams'. -- The `Login Teams` contains a link, which is the Embedded Login link for your Rocket.Chat account. - -### 3. Login with Microsoft in opened web page - -- Click `Login Teams` link. -- The link will redirect you to a Microsoft login web page. -- Login with your Teams account or Guest account. -- Click `Yes` if you see the login page ask authorization for specific permissions from you. -- If you successfully login to Teams and authorize the TeamsBridge App, the web pages will show `Login to Teams succeed! You can close this window now.`. You can just close the window. - -## Collaboration Experience - -One of the most important goals of Rocket.Chat TeamsBridge App is to build a smooth user experience for both users on Rocket.Chat and Microsoft Teams. To achieve this, TeamsBridge App introduces a concept called `Teams Bot User` in Rocket.Chat world. Each Rocket.Chat `Teams Bot User` represents a real user on Microsoft Teams. When a Rocket.Chat user that has already `embedded login` to his Teams account sends a message to a `Teams Bot User`, the message will be delivered to Microsoft Teams world with the original sender's Teams account as the sender and the `Teams Bot User`'s corresponding Teams account as the receiver. As a result, from the Rocket.Chat users' perspective, they are just collaborating with someone on Rocket.Chat. Meanwhile, from the Teams users' perspective, they are just messaging someone on Teams. With the `Teams Bot User` approach, the TeamsBridge App delivers messages between Rocket.Chat and Microsoft Teams while keeping the orginal collaboration experience for users on both platforms. - -### Send one on one Direct Message to a collaborator who use Microsoft Teams - -To send a one on one Direct Message from Rocket.Chat to a collaborator who use Microsoft Teams, the Rocket.Chat user just need to search the `Teams Bot User` that represent the Teams user in Rocket.Chat client and send a message to them. The message will be delivered to Microsoft Teams world with the original sender's Teams account as the sender and the `Teams Bot User`'s corresponding Teams account as the receiver. - -### Receive one on one Direct Message from a collaborator who use Microsoft Teams - -This feature is under development and will be available soon. - -### Send Message to a group chat with participant(s) who use Microsoft Teams - -Currently, this is NOT a supported scenario, which is under developer and will be added soon in the future. - -### Receive Message in a group chat with participant(s) who use Microsoft Teams - -This feature is under development and will be available soon. - -### Supported Message Types - -Currently, the following message types are supported: -- Text Message