---
title: "Rule Examples"
---

{{< lead >}}
These are only a few examples of rules. If you want to share your own rules and show what can be achieved with the bot, head over to the ["Share your Rules"](https://github.com/Luzifer/twitch-bot/discussions/categories/share-your-rules) discussion board and create a new discussion with the YAML definition and a description what your rule does.
{{< /lead >}}

## Chat-addable generic text-respond-commands

```yaml
- uuid: 688e631f-08a8-5544-b4b2-1737ea71ce00
  description: Trigger Generic Command
  actions:
    - type: respond
      attributes:
        message: '{{ variable (list "genericcmd" .channel (group 1) | join ":") }}'
  cooldown: 1m0s
  match_channels:
    - '#luziferus'
    - '#tezrian'
  match_message: '^!([^\s]+)(?: |$)'
  disable_on_template: '{{ eq (variable (list "genericcmd" .channel (group 1) | join ":")) "" }}'

- uuid: ba4f7bb3-af39-5c57-bb97-216a8af69246
  description: Set Generic Command
  actions:
    - type: setvariable
      attributes:
        set: '{{ group 2 }}'
        variable: '{{ list "genericcmd" .channel (group 1) | join ":" }}'
    - type: respond
      attributes:
        message: '[Admin] Set command !{{ group 1 }} to "{{ group 2 }}"'
  match_channels:
    - '#luziferus'
    - '#tezrian'
  match_message: ^!setcmd ([^\s]+) (.*)
  enable_on:
    - broadcaster
    - moderator

- uuid: 21619e80-2c6a-536e-8b83-e5fe6c580356
  description: Clear Generic Command
  actions:
    - type: setvariable
      attributes:
        clear: true
        variable: '{{ list "genericcmd" .channel (group 1) | join ":" }}'
    - type: respond
      attributes:
        message: '[Admin] Deleted command !{{ group 1 }}'
  match_channels:
    - '#luziferus'
    - '#tezrian'
  match_message: ^!clearcmd ([^\s]+)
  enable_on:
    - broadcaster
    - moderator
```

## Display Stream-Schedule in Chat

```yaml
- actions:
    - type: respond
      attributes:
        message: |-
            {{- $segs := scheduleSegments .channel 3 -}}
            {{- $fmtSegs := list -}}
            {{- range $segs -}}
            {{- $fmtSegs = mustAppend $fmtSegs (
              printf "%s @ %s"
                (.Category.Name)
                (dateInZone "02.01. 15:40" .StartTime "Europe/Berlin")
            ) -}}
            {{- end -}}
            Next streams are: {{ $fmtSegs | join ", " }}
            - See more in the Twitch schedule:
            https://www.twitch.tv/{{ fixUsername .channel }}/schedule
  match_message: '!schedule\b'
```

## Game death counter with dynamic name

```yaml
  - actions:
    - type: counter
      attributes:
        counter: '{{ channelCounter (recentGame .channel) }}'
    - type: respond
      attributes:
        message: >-
          I already died {{ counterValue (channelCounter (recentGame .channel)) }}
          times in {{ recentGame .channel }}'
    cooldown: 60s
    enable_on: [broadcaster, moderator]
    match_channels: ['#mychannel']
    match_message: '^!death'
```

## Notify Discord when stream is live

```yaml
  - actions:
      - type: discordhook
        attributes:
          add_embed: true
          avatar_url: '{{ profileImage .channel }}'
          content: |
            <@&123456789012345678> {{ displayName (fixUsername .channel) (fixUsername .channel) }}
            is now live on https://www.twitch.tv/{{ fixUsername .channel }} - join us!
          embed_author_icon_url: '{{ profileImage .channel }}'
          embed_author_name: '{{ displayName (fixUsername .channel) (fixUsername .channel) }}'
          embed_fields: |
              {{
                toJson (
                  list
                    (dict
                      "name" "Game"
                      "value" (recentGame .channel))
                )
              }}
          embed_image: https://static-cdn.jtvnw.net/previews-ttv/live_user_{{ fixUsername .channel }}-1280x720.jpg
          embed_thumbnail: '{{ profileImage .channel }}'
          embed_title: '{{ recentTitle .channel }}'
          embed_url: https://twitch.tv/{{ fixUsername .channel }}
          hook_url: https://discord.com/api/webhooks/[...]/[...]
          username: 'Stream-Live: {{ displayName (fixUsername .channel) (fixUsername .channel) }}'
    match_event: stream_online
```

## Post follow date for an user

```yaml
  - actions:
    - type: respond
      attributes:
        message: 'You followed on {{ ( followDate .username ( fixUsername .channel ) ).Format "2006-01-02" }}'
    match_channels: ['#mychannel']
    match_message: '^!followage'
```

## Respond to a message after random delay

```yaml
  - actions:
    # Respond after 30-40s
    - type: delay
      attributes:
        delay: 30s
        jitter: 10s
    - type: respond
      attributes:
        message: 'Hey {{ .username }}'
    match_channels: ['#mychannel']
    match_message: '^Hi'
```

## Send a notification on successful permit

```yaml
  - actions:
    - type: respond
      attributes:
        message: '{{ mention .to }}, you will not get timed out for the next {{ .permitTimeout }} seconds.'
    match_channels: ['#mychannel']
    match_event: 'permit'
```

## Shoutout command with game query

```yaml
  - actions:
    - type: respond
      attributes:
        message: >-
          Check out @{{ fixUsername (group 1) }} and leave a follow,
          they were last playing {{ recentGame (fixUsername (group 1)) "something mysterious" }}
          at https://twitch.tv/{{ fixUsername (group 1) }}
    enable_on: [broadcaster, moderator]
    match_channels: ['#mychannel']
    match_message: '^!so ([@\w]+)'
```

## VIP of the Month

In this example a channel-point reward for one month of VIP status exists which is automated through the bot. To get the `.reward_id` you can use the [Debug-Overlay]({{< ref "../overlays/_index.md" >}}) or just use the `.reward_title` variable and check against the name of the reward.

```yaml
  - description: 'Channel-Point-Reward: VIP of the month'
    actions:
      - type: vip
        attributes:
          channel: '{{ .channel }}'
          user: '{{ .user }}'
      - type: customevent
        attributes:
          fields: |-
            {{
              toJson (
                dict
                  "targetChannel" .channel
                  "targetUser" .user
                  "type" "timed_unvip"
              )
            }}
          schedule_in: 744h
    match_event: channelpoint_redeem
    disable_on_template: '{{ ne .reward_id "aaa66d18-8dab-46f4-a222-6ff228f2fdfb" }}'
    disable_on: [moderator, vip]

  - description: 'Channel-Point-Reward: Remove VIP of the month'
    actions:
      - type: unvip
        attributes:
          channel: '{{ .targetChannel }}'
          user: '{{ .targetUser }}'
    match_event: custom
    disable_on_template: '{{ ne .type "timed_unvip" }}'
```