diff --git a/changelog.d/852.feature b/changelog.d/852.feature new file mode 100644 index 000000000..127adc6cb --- /dev/null +++ b/changelog.d/852.feature @@ -0,0 +1 @@ +Warn if the bot does not have permissions to talk in a room. diff --git a/src/Widgets/BridgeWidgetApi.ts b/src/Widgets/BridgeWidgetApi.ts index 6e64aec7e..ab172c167 100644 --- a/src/Widgets/BridgeWidgetApi.ts +++ b/src/Widgets/BridgeWidgetApi.ts @@ -176,9 +176,13 @@ export class BridgeWidgetApi extends ProvisioningApi { // If we have a service filter. .filter(c => typeof serviceFilter !== "string" || c?.service === serviceFilter) as GetConnectionsResponseItem[]; const userPl = powerlevel.content.users?.[req.userId] || powerlevel.defaultUserLevel; + const botPl = powerlevel.content.users?.[botUser.userId] || powerlevel.defaultUserLevel; for (const c of connections) { - const requiredPl = Math.max(powerlevel.content.events?.[c.type] || 0, powerlevel.defaultStateEventLevel); - c.canEdit = userPl >= requiredPl; + // TODO: What about crypto? + const requiredPlForEdit = Math.max(powerlevel.content.events?.[c.type] ?? 0, powerlevel.defaultStateEventLevel); + const requiredPlForMessages = Math.max(powerlevel.content.events?.["m.room.message"] ?? powerlevel.content.events_default ?? 0); + c.canEdit = userPl >= requiredPlForEdit; + c.canSendMessages = botPl >= requiredPlForMessages; if (!c.canEdit) { delete c.secrets; } diff --git a/src/provisioning/api.ts b/src/provisioning/api.ts index 26be75116..1f6e76cac 100644 --- a/src/provisioning/api.ts +++ b/src/provisioning/api.ts @@ -18,6 +18,7 @@ export interface GetConnectionsResponseItem e id: string; config: Config; secrets?: Secrets; + canSendMessages?: boolean; canEdit?: boolean; warning?: ConnectionWarning; } diff --git a/web/components/roomConfig/RoomConfig.tsx b/web/components/roomConfig/RoomConfig.tsx index b9f8294ab..04c5f1ad3 100644 --- a/web/components/roomConfig/RoomConfig.tsx +++ b/web/components/roomConfig/RoomConfig.tsx @@ -96,6 +96,8 @@ export const RoomConfig = function([]); + const canSendMessages = connections?.every(c => c.canSendMessages) ?? true; + useEffect(() => { // produce `toMigrate` composed of `migrationCandidates` with anything already in `connections` filtered out // use `migrationComparator` to determine duplicates @@ -164,6 +166,12 @@ export const RoomConfig = function{text.header} } + { !canSendMessages && canEditRoom && + + This room does not permit the bot to send messages. + Please go to the room settings in your client and adjust permissions. + + } { canEditRoom &&

{text.createNew}

{serviceConfig &&