Merge pull request #87 from Half-Shot/hs/ensure-webhooks-store-hookId-internally

Ensure webhook hookIds are stored internally
This commit is contained in:
Will Hunt 2021-11-30 19:36:01 +00:00 committed by GitHub
commit d2b1ff64da
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 4 deletions

View File

@ -8,7 +8,7 @@ import { Appservice, StateEvent } from "matrix-bot-sdk";
import { CommentProcessor } from "./CommentProcessor"; import { CommentProcessor } from "./CommentProcessor";
import { BridgeConfig, GitLabInstance } from "./Config/Config"; import { BridgeConfig, GitLabInstance } from "./Config/Config";
import { GitHubDiscussionConnection, GitHubDiscussionSpace, GitHubIssueConnection, GitHubProjectConnection, GitHubRepoConnection, GitHubUserSpace, GitLabIssueConnection, GitLabRepoConnection, IConnection } from "./Connections"; import { GitHubDiscussionConnection, GitHubDiscussionSpace, GitHubIssueConnection, GitHubProjectConnection, GitHubRepoConnection, GitHubUserSpace, GitLabIssueConnection, GitLabRepoConnection, IConnection } from "./Connections";
import { GenericHookConnection } from "./Connections/GenericHook"; import { GenericHookAccountData, GenericHookConnection } from "./Connections/GenericHook";
import { JiraProjectConnection } from "./Connections/JiraProject"; import { JiraProjectConnection } from "./Connections/JiraProject";
import { GithubInstance } from "./Github/GithubInstance"; import { GithubInstance } from "./Github/GithubInstance";
import { GitLabClient } from "./Gitlab/Client"; import { GitLabClient } from "./Gitlab/Client";
@ -16,6 +16,7 @@ import { JiraProject } from "./Jira/Types";
import LogWrapper from "./LogWrapper"; import LogWrapper from "./LogWrapper";
import { MessageSenderClient } from "./MatrixSender"; import { MessageSenderClient } from "./MatrixSender";
import { UserTokenStore } from "./UserTokenStore"; import { UserTokenStore } from "./UserTokenStore";
import {v4 as uuid} from "uuid";
const log = new LogWrapper("ConnectionManager"); const log = new LogWrapper("ConnectionManager");
@ -137,9 +138,18 @@ export class ConnectionManager {
} }
if (GenericHookConnection.EventTypes.includes(state.type) && this.config.generic?.enabled) { if (GenericHookConnection.EventTypes.includes(state.type) && this.config.generic?.enabled) {
// Generic hooks store the hookId in the account data
let acctData = await this.as.botClient.getSafeRoomAccountData<GenericHookAccountData|null>(GenericHookConnection.CanonicalEventType, roomId);
if (!acctData) {
log.info(`hookId for ${roomId} not set, setting`);
acctData = { hookId: uuid() };
await this.as.botClient.setRoomAccountData(GenericHookConnection.CanonicalEventType, roomId, acctData);
await this.as.botClient.sendStateEvent(roomId, GenericHookConnection.CanonicalEventType, state.stateKey, {...state.content, hookId: acctData.hookId });
}
return new GenericHookConnection( return new GenericHookConnection(
roomId, roomId,
state.content, state.content,
acctData,
state.stateKey, state.stateKey,
this.messageClient, this.messageClient,
this.config.generic.allowJsTransformationFunctions this.config.generic.allowJsTransformationFunctions

View File

@ -6,10 +6,20 @@ import { Script, createContext } from "vm";
import { MatrixEvent } from "../MatrixEvent"; import { MatrixEvent } from "../MatrixEvent";
export interface GenericHookConnectionState { export interface GenericHookConnectionState {
/**
* This is ONLY used for display purposes.
*/
hookId: string; hookId: string;
transformationFunction?: string; transformationFunction?: string;
} }
export interface GenericHookAccountData {
/**
* This is where the true hook ID is kept.
*/
hookId: string;
}
const log = new LogWrapper("GenericHookConnection"); const log = new LogWrapper("GenericHookConnection");
const md = new markdownit(); const md = new markdownit();
@ -28,13 +38,14 @@ export class GenericHookConnection implements IConnection {
]; ];
public get hookId() { public get hookId() {
return this.state.hookId; return this.accountData.hookId;
} }
private transformationFunction?: Script; private transformationFunction?: Script;
constructor(public readonly roomId: string, constructor(public readonly roomId: string,
private state: GenericHookConnectionState, state: GenericHookConnectionState,
private readonly accountData: GenericHookAccountData,
private readonly stateKey: string, private readonly stateKey: string,
private messageClient: MessageSenderClient, private messageClient: MessageSenderClient,
private readonly allowJSTransformation: boolean = false) { private readonly allowJSTransformation: boolean = false) {
@ -58,11 +69,28 @@ export class GenericHookConnection implements IConnection {
} }
} }
public transformHookData(data: Record<string, unknown>): string {
// Supported parameters https://developers.mattermost.com/integrate/incoming-webhooks/#parameters
let msg = "";
if (typeof data.username === "string") {
// Create a matrix user for this person
msg = `**${data.username}**: `
}
if (typeof data.text === "string") {
msg = data.text;
} else {
msg = `Recieved webhook data:\n\n\`\`\`${JSON.stringify(data, undefined, 2)}\`\`\``;
}
// TODO: Transform Slackdown into markdown.
return msg;
}
public async onGenericHook(data: Record<string, unknown>) { public async onGenericHook(data: Record<string, unknown>) {
log.info(`onGenericHook ${this.roomId} ${this.hookId}`); log.info(`onGenericHook ${this.roomId} ${this.hookId}`);
let content: string; let content: string;
if (!this.transformationFunction) { if (!this.transformationFunction) {
content = `Recieved webhook data:\n\n\`\`\`${JSON.stringify(data)}\`\`\``; content = this.transformHookData(data);
} else { } else {
try { try {
const context = createContext({data}); const context = createContext({data});