mirror of
https://github.com/ReCloudStudio/WebHooker.git
synced 2026-09-22 16:11:29 +00:00
Add a field filter type reading any payload value by JSONPath with array expansion, 12 comparison operators (eq/ne/contains/startsWith/endsWith/regex/gt/gte/lt/lte/in/exists), a visual AST builder (all/any/not) in the route editor, chip-based multi-value input, a stateless POST /admin/api/test-match dry-run, and named filter fragments stored in D1 (d1_fragments, migration 0010) inlined into route ASTs on insert.
157 lines
4.9 KiB
YAML
157 lines
4.9 KiB
YAML
# Routes
|
|
# Each route defines a filter chain and one or more target destinations
|
|
# (Discord channel/thread and/or Telegram chat/topic). See docs/guide/configuration.md.
|
|
|
|
# Groups scope admin access and can restrict which org/user events flow in.
|
|
groups:
|
|
- id: default
|
|
name: "Default"
|
|
# Members with roles (owner / admin / viewer); legacy adminIds still work and are treated as owners.
|
|
members:
|
|
- login: "your-github-id"
|
|
role: owner
|
|
# owners: ["myorg"] # restrict events to this org/user (optional)
|
|
# providers: ["github", "gitea"] # restrict to source platforms (optional; empty = all)
|
|
# installationId: 12345678 # GitHub App installation binding (auto-created on installation.created)
|
|
# emoji: true # include emoji in messages (default true)
|
|
# Forge hosts: label message footers with the host an event came from
|
|
# (optional `name` overrides the host as the display label).
|
|
# forgeSources:
|
|
# - host: "github.com" # GitHub events match github.com
|
|
# type: github
|
|
# name: "GitHub 主站" # optional display label
|
|
# - host: "git1.example.com" # a self-hosted Gitea instance
|
|
# type: gitea
|
|
# - host: "git2.example.com" # another one
|
|
# type: gitea
|
|
# lang: "en" # message language for this group's routes (en/zh, default en)
|
|
# Webhook log channel: a Discord channel/thread or Telegram chat/topic that
|
|
# receives a summary of every webhook this group's routes dispatch.
|
|
# logTarget:
|
|
# platform: discord
|
|
# channelId: "CHANNEL_ID_HERE"
|
|
# threadId: "" # optional
|
|
# logTarget:
|
|
# platform: telegram
|
|
# chatId: "-1001234567890"
|
|
# topicId: "" # optional
|
|
|
|
routes:
|
|
- id: all-push
|
|
name: "All Push Events"
|
|
enabled: true
|
|
groupId: default
|
|
filters:
|
|
- type: event
|
|
match: push
|
|
targets:
|
|
- platform: discord
|
|
channelId: "CHANNEL_ID_HERE"
|
|
|
|
# - id: specific-repo
|
|
# name: "Specific Repo"
|
|
# enabled: true
|
|
# groupId: default
|
|
# filters:
|
|
# - type: repo
|
|
# match: "org/repo"
|
|
# - type: event
|
|
# match: [pull_request, issues]
|
|
# targets:
|
|
# - platform: discord
|
|
# channelId: "CHANNEL_ID_HERE"
|
|
# threadId: "THREAD_ID_HERE"
|
|
# - platform: telegram
|
|
# chatId: "-1001234567890"
|
|
# topicId: "9876543210"
|
|
|
|
# - id: exclude-bot
|
|
# name: "Exclude Bot Actions"
|
|
# enabled: true
|
|
# groupId: default
|
|
# filters:
|
|
# - type: actor
|
|
# match: "[bot]"
|
|
# exclude: true
|
|
# targets:
|
|
# - platform: discord
|
|
# channelId: "CHANNEL_ID_HERE"
|
|
|
|
# Discord role mentions: when this route fires, the listed role ids are
|
|
# pinged in every Discord target (Telegram targets ignore this field).
|
|
# - id: mention-on-release
|
|
# name: "Mention Roles on Release"
|
|
# enabled: true
|
|
# groupId: default
|
|
# discordRoleIds: ["111111111111111111", "222222222222222222"]
|
|
# filters:
|
|
# - type: event
|
|
# match: release
|
|
# - type: action
|
|
# match: published
|
|
# targets:
|
|
# - platform: discord
|
|
# channelId: "CHANNEL_ID_HERE"
|
|
|
|
# Fallback routes only fire when no other (non-fallback) route matched.
|
|
# - id: fallback-all
|
|
# name: "Fallback: everything else"
|
|
# enabled: true
|
|
# groupId: default
|
|
# fallback: true
|
|
# filters: []
|
|
# targets:
|
|
# - platform: telegram
|
|
# chatId: "-1001234567890"
|
|
|
|
# Stop routes stop processing further routes when matched.
|
|
# - id: exclusive-push
|
|
# name: "Exclusive Push"
|
|
# enabled: true
|
|
# groupId: default
|
|
# stop: true
|
|
# filters:
|
|
# - type: event
|
|
# match: push
|
|
# targets:
|
|
# - platform: discord
|
|
# channelId: "CHANNEL_ID_HERE"
|
|
|
|
# Field filters match any payload field via a JSONPath (dot-separated) `path`,
|
|
# with an optional `op` operator (eq/ne/contains/startsWith/endsWith/regex/
|
|
# gt/gte/lt/lte/in/exists). Arrays are expanded: any matching element wins.
|
|
# - id: big-pr
|
|
# name: "Large Pull Requests"
|
|
# enabled: true
|
|
# groupId: default
|
|
# filters:
|
|
# - type: event
|
|
# match: pull_request
|
|
# - type: field
|
|
# path: "pull_request.commits"
|
|
# op: gte
|
|
# match: "10"
|
|
# targets:
|
|
# - platform: discord
|
|
# channelId: "CHANNEL_ID_HERE"
|
|
|
|
# Nested `ast` groups (all / any / not) replace the flat filters list and take
|
|
# precedence over `filters` when both are present.
|
|
# - id: grouped-owners
|
|
# name: "PRs from either owner"
|
|
# enabled: true
|
|
# groupId: default
|
|
# ast:
|
|
# all:
|
|
# - type: event
|
|
# match: pull_request
|
|
# - any:
|
|
# - type: field
|
|
# path: "pull_request.user.login"
|
|
# match: alice
|
|
# - type: field
|
|
# path: "pull_request.user.login"
|
|
# match: bob
|
|
# targets:
|
|
# - platform: discord
|
|
# channelId: "CHANNEL_ID_HERE"
|