- 記事一覧 >
- ブログ記事
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"」がメッセージに含まれていて、ボードとスイムレーンは毎回同じなのに、情報量が多いなあと感じていました。
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
ヨシ!
カード移動に限らず、他のメッセージも一律/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文を書き換えての対処になりました。
その他、宣伝、誹謗中傷等、当方が不適切と判断した書き込みは、理由の如何を問わず、投稿者に断りなく削除します。
書き込み内容について、一切の責任を負いません。
このコメント機能は、予告無く廃止する可能性があります。ご了承ください。
コメントの削除をご依頼の場合はTwitterのDM等でご連絡ください。