1. 記事一覧 >
  2. ブログ記事
category logo

WekanのWebHookメッセージをソースコードを書き換えて変更した

(更新) (公開)

はじめに

WekanのWebHookメッセージをWekanのソースコードを書き換えて変更しました。また、通知が不要なイベントがあったのですが、設定で変更できないため、こちらもソースコードを書き換えて、通知されないようにしました。
CentOS8にwekanをインストール(ソースからビルド編)
GitLab,Wekan→Rocket.Chat→SlackのWebHook
を実施済みを前提とします。
Wekanがdockerやsnapで運用されている場合は、考慮していません。
今回は、Wekan → RockeChat 間のOutgoing WebHookのみ関係します。

【検証環境】

CentOS Linux release 8.3.2011

 Wekan バージョン 5.25.0

 Meteor バージョン 2.2

 Nodeバージョン 12.22.1

 MongoDB バージョン 4.4.5

CentOS Linux release 8.3.201

 RocketChatバージョン 3.13.3


メッセージ変更

ボード "TODO"
スイムレーン "Default"
でしか使っていなくて、以下のようにカードを移動すると、
必ず、「ボード "TODO"」「スイムレーン "Default"」がメッセージに含まれていて、ボードとスイムレーンは毎回同じなのに、情報量が多いなあと感じていました。

カードを移動「ボード TODO」「スイムレーン Default」


カードを移動 ロケットチャットの結果


WebHookで送られてくるパラーメータは、以下のようになっていて、Incomming WebHook(RocketChat側)で変更しようとすると、正規表現を使ったりして、変えられそうですが、今回は、Wekan側の対処となります。

{
  "text": "部長 カード \"テスト1\" / ボード \"TODO\" が スイムレーン \"Default\", リスト \"佐藤\" から スイムレーン \"Default\", リスト \"田中\" に移動されました<br>http://wekan.itccorporation.jp/b/xaBTxLvYNWH2Q6eZT/todo/vfWgrcK4KfwzvaZNc",
  "cardId": "vfWgrcK4KfwzvaZNc",
  "listId": "3fupnPM9bRzEaA5pC",
  "oldListId": "N3Pat4DnNe6PffttN",
  "boardId": "xaBTxLvYNWH2Q6eZT",
  "user": "部長",
  "card": "テスト1",
  "swimlaneId": "WK4cAspcKXJgNDfwx",
  "description": "act-moveCard"
}

カード "テスト1" / ボード "TODO" が スイムレーン "Default", リスト "佐藤" から スイムレーン "Default", リスト "田中" に移動されました

"テスト1" が リスト "佐藤" から リスト "田中" に移動されました

に変えます。

# vi /opt/wekan/i18n/ja.i18n.json
  "//act-moveCard": "カード __card__ / ボード __board__ が スイムレーン __oldSwimlane__, リスト __oldList__ から スイムレーン __swimlane__, リスト __list__ に移動されました",
  "act-moveCard": "__card__ が リスト __oldList__ から リスト __list__ に移動されました",

これだけですが、/opt/wekan/i18n/ja.i18n.jsonはビルドするときに読み込まれるのみで、実際には、/opt/wekan/.build/bundle/programs/server/app/app.jsに書かれていて、実際の動作には反映されません。
再ビルドが必要です。


●再ビルドして変更を反映

wekanを止めます。

# systemctl stop wekan

/opt/wekan/.build/bundle/.envはビルドすると消えるため、退避します。

# cd /opt/wekan/
# cp /opt/wekan/.build/bundle/.env .

meteor buildを実行します。meteor buildはWekanをインストールするときに出てきたコマンドです。(詳細:「CentOS8にwekanをインストール(ソースからビルド編)」)

# meteor build .build --directory --allow-superuser

退避した.envを元の位置に戻します。

# mv .env /opt/wekan/.build/bundle/

npm installを実施します。

# cd /opt/wekan/.build/bundle/programs/server
# npm install


Wekanをインストールするときに出てきたコマンドですが、これを行わないと、以下のエラーになり、起動しなかったため、必要と分かりました。

 internal/modules/cjs/loader.js:818
  throw err;```
  ^
 Error: Cannot find module 'reify/lib/runtime'
 Require stack:
 - /opt/wekan/.build/bundle/programs/server/runtime.js# systemctl start wekan
 - /opt/wekan/.build/bundle/main.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15)
    at Function.Module._load (internal/modules/cjs/loader.js:667:27)
    at Module.require (internal/modules/cjs/loader.js:887:19)
    at require (internal/modules/cjs/helpers.js:74:18)
    at Object.<anonymous> (/opt/wekan/.build/bundle/programs/server/runtime.js:10:3)
    at Object.<anonymous> (/opt/wekan/.build/bundle/programs/server/runtime.js:53:3)
    at Module._compile (internal/modules/cjs/loader.js:999:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
    at Module.load (internal/modules/cjs/loader.js:863:32)
    at Function.Module._load (internal/modules/cjs/loader.js:708:14) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/opt/wekan/.build/bundle/programs/server/runtime.js',
    '/opt/wekan/.build/bundle/main.js'
  ]
 }

Wekanを起動します。

# systemctl start wekan

カードを移動「ボード TODO」「スイムレーン Default」


カードを移動 ロケットチャットの結果 修正後


ヨシ!


カード移動に限らず、他のメッセージも一律/opt/wekan/i18n/ja.i18n.jsonを変更して変えられそうです。


通知が不要なイベントの対処

以下のようにカードにラベルを付けたときの通知が不要だなと感じていました。
カード追加→案件の種類ごとにラベルで印を付けると、"カード追加"と"ラベル追加"が連続で通知されます。

カード追加とラベル追加


カード追加とラベル追加 ロケットチャットの結果


{
  text: '部長 ラベル __label__ を ボード "TODO", スイムレーン "Default", リスト "佐藤", カード "テスト1" に追加しました\n' +
    'http://wekan.itccorporation.jp/b/xaBTxLvYNWH2Q6eZT/todo/vfWgrcK4KfwzvaZNc',
  cardId: 'vfWgrcK4KfwzvaZNc',
  listId: 'N3Pat4DnNe6PffttN',
  boardId: 'xaBTxLvYNWH2Q6eZT',
  user: '部長',
  card: 'テスト1',
  swimlaneId: 'WK4cAspcKXJgNDfwx',
  description: 'act-addedLabel'
}

description=act-addedLabelの時は通知を除外したいですが、そのような設定は画面にもサーバー側のconfigにも無さそうでした。
ソースコードを見ると、以下の部分で通知が発射されているのが分かりました。

/opt/wekan/models/activities.js

     const integrations = Integrations.find({
       boardId: { $in: [board._id, Integrations.Const.GLOBAL_WEBHOOK_ID] },
       // type: 'outgoing-webhooks', // all types
       enabled: true,
       activities: { $in: [description, 'all'] },
     }).fetch();
     if (integrations.length > 0) {
       params.watchers = watchers;
       integrations.forEach(integration => {
         Meteor.call(
           'outgoingWebhooks',
           integration,
           description,
           params,
           () => {
             return;
           },
         );
       });
     }

if (integrations.length > 0) {

if (integrations.length > 0 && description !== 'act-addedLabel') {
に書き換えてビルドします。

# vi /opt/wekan/models/activities.js
     if (integrations.length > 0 && description !== 'act-addedLabel') {
# systemctl stop wekan
# cd /opt/wekan/
# cp /opt/wekan/.build/bundle/.env .
# meteor build .build --directory --allow-superuser
# mv .env /opt/wekan/.build/bundle/
# cd /opt/wekan/.build/bundle/programs/server
# npm install
# systemctl start wekan

カード追加とラベル追加


カード追加とラベル追加 ロケットチャットの結果 修正後


ヨシ!


通知対象イベント登録

     const integrations = Integrations.find({
       boardId: { $in: [board._id, Integrations.Const.GLOBAL_WEBHOOK_ID] },
       // type: 'outgoing-webhooks', // all types
       enabled: true,
       activities: { $in: [description, 'all'] },
     }).fetch();

の部分ですが、何をやっているかと言うと、mongodb の integrationsコレクションからマッチするactivitiesを探しています。

# mongo
> use wekan
> db.integrations.find().pretty()
{
  "_id" : "KJMRKfzBaYvcALQ3c",
  "url" : "http://192.168.12.215:3000/hooks/qTHNGD9zTpEWjAXvi/bQ2Z6woGGxc3zNFzmbxNzScwc4SAd23sbZF5MqfqShgu78pX",
  "type" : "outgoing-webhooks",
  "title" : "RocketChat",
  "enabled" : true,
  "userId" : "ajPTAFHTMrhXyZCy4",
  "boardId" : "_global",
  "activities" : [
          "all"
  ],
  "createdAt" : ISODate("2021-06-16T09:04:02.296Z"),
  "modifiedAt" : ISODate("2021-11-02T14:20:11.406Z")
}

activitiesが"all"で登録されているため、必ずマッチして、必ず通知になります。

例えば、

db.integrations.update({ _id: "KJMRKfzBaYvcALQ3c" }, { $set: { activities: [ "act-createCard" ] } })

のようにすると、description=act-createCard(カード追加)のときだけしか通知されなくなりました。

ただ、この場合、逆に、指定イベントだけ除外ということはできないため、除外したいイベント以外を把握して、{ $set: { activities: [ "act-createCard", "act-addedLabel", ・・・ ] } } と全部登録しないといけません。そのため、ソースコードのif文を書き換えての対処になりました。


loading...