Auslösen benutzerdefinierter Abzeichenabfragen erstellen

:bookmark: Diese Anleitung erklärt, wie man ausgelöste benutzerdefinierte Abzeichenabfragen in Discourse erstellt, einschließlich der Arten von Abzeichen, Einschränkungen für ausgelöste Abzeichen und einer Beispielabfrage.

:person_raising_hand: Erforderlicher Benutzerlevel: Administrator

:warning: Diese Funktion ist standardmäßig deaktiviert. Um sie zu aktivieren, folgen Sie dieser Anleitung.

Bei der Definition von Abzeichen in Discourse stoßen Sie auf eine „Trigger“-Option mit den folgenden Auswahlmöglichkeiten:

  • Täglich aktualisieren
  • Wenn ein Benutzer auf einen Beitrag reagiert
  • Wenn ein Benutzer einen Beitrag bearbeitet oder erstellt
  • Wenn ein Benutzer den Vertrauenslevel ändert
  • Wenn ein Benutzer bearbeitet oder erstellt wird

Diese Trigger erzwingen, dass Abzeichen häufiger als täglich ausgeführt werden, wodurch sichergestellt wird, dass Benutzer über neue Abzeichen näher an dem Zeitpunkt benachrichtigt werden, zu dem die Aktion stattgefunden hat.

Arten von Abzeichen

Es gibt zwei Arten von Abzeichen, die Sie definieren können:

  1. Abzeichen, die auf Beiträge abzielen
  2. Abzeichen, die nicht auf Beiträge abzielen

Alle SQL-Definitionen für Abzeichen erfordern, dass Sie die Spalten user_id und granted_at auswählen. Wenn Ihr Abzeichen auf Beiträge abzielt, müssen Sie außerdem eine Spalte namens post_id auswählen.

:information_source: Wenn diese Spalten nicht direkt verfügbar sind, können Sie ihnen einen Alias zuweisen. Zum Beispiel: u.id as user_id

Einschränkungen für ausgelöste Abzeichen

Da ausgelöste Abzeichen einmal pro Minute ausgeführt werden können, müssen Sie mehr „Hinweise“ in der Abzeichendefinition geben. Es reicht nicht aus, den vollständigen Satz von Abzeichen zurückzugeben; Sie müssen auch Hinweise dazu geben, wie das Abzeichen für eine Teilmenge ausgeführt werden soll.

Benutzerbasierte Trigger

Wenn Ihr Trigger benutzerbasiert ist, geben Sie eine Klausel an, wie er basierend auf :user_ids gefiltert werden soll.

Beitragsbasierte Trigger

Wenn Ihr Trigger beitragsbasiert ist, geben Sie Informationen darüber an, wie er basierend auf :post_ids ausgelöst werden soll.

:exclamation: Denken Sie daran, dass eine vollständige Wiederherstellung (Backfill) täglich unabhängig davon ausgeführt wird. Sie müssen dies berücksichtigen und die Behandlung des Parameters :backfill einbeziehen.

Ihre ausgelöste Abzeichenabfrage enthält immer den Parameter :backfill und entweder den Parameter :post_ids oder :user_ids.

Beispiel für eine ausgelöste Abzeichenabfrage

Hier ist ein Beispiel für ein Abzeichen, das ausgelöst wird, „wenn ein Benutzer auf einen Beitrag reagiert“. In diesem Fall erhalten „Delta“-Anwendungen den Parameter :post_ids:

SELECT p.user_id, p.id post_id, p.updated_at granted_at
FROM badge_posts p
WHERE p.like_count >= 25
AND (:backfill OR p.id IN (:post_ids) )

Die Klausel (:backfill OR p.id IN (:post_ids) ) ermöglicht die Filterung der Ergebnisse. Wenn der tägliche Job ausgeführt wird, ist :backfill wahr, sodass der gesamte Satz gescannt wird. Wenn Delta-Jobs ausgeführt werden, ist :backfill falsch und :post_ids wird gesetzt.

Warum manuelle Hinweise notwendig sind

Die Abzeichenzuweisungsabfrage führt Ihre Abzeichenabfrage in einer „Unterabfrage“ aus. Oft hat der PostgreSQL-Optimierer Schwierigkeiten beim Scannen der vollständigen Menge, wenn sich die Klausel in der Hauptabfrage befindet. Obwohl er einfache Abfragen gut verarbeiten kann, kann er bei komplexeren Aggregationen versagen.

Um potenzielle Probleme zu vermeiden, wurde diese Einschränkung hinzugefügt, die es Ihnen ermöglicht, Filter an der am besten geeigneten Stelle anzuwenden.

Hilfe benötigt?

Wenn Sie Schwierigkeiten beim Schreiben einer Abzeichenabfrage haben, stellen Sie eine Frage in Support – beschreiben Sie, was Sie erreichen möchten, und fügen Sie Ihre laufende Arbeit bei. Die Community wird versuchen zu helfen.

:information_source: Abzeichentrigger können komplex sein. Oftmals reichen „tägliche“ Aktualisierungen aus, und Sie können die komplizierteren Aspekte ausgelöster Abfragen überspringen.

38 „Gefällt mir“
Creating Custom Badges and Triggers
Creating custom badge with custom rules
How to grant badges using Automation?
Two custom badges on moderation
Pre approval email in the dashboard waiting to go
Help me get Discourse set up for the first time
Grant badges based on gender profile field?
Badges for X Number of Solutions Created?
Discourse-Math badge
Assigned a badge based on multiple badge assignment
Problem testing Badge Query from Data Explorer
Understanding and using badges
First Post badge
Grant Badge when user visits link
Custom Icons for admins and moderators (and other groups)
A silver badge for _each_ 5 bronze badges
Automatically set active members to follow a category
A silver badge for _each_ 5 bronze badges
A silver badge for _each_ 5 bronze badges
About Badges
What is the 'backfill`?
Query to create some groups based on activity
Are badges customizable?
Badge query working in explorer but not in badge SQL?
Badges for posting
Plugin or other option to require a post and a like?
Gamification beyond Leaderboard
Bulk Award a badge to a set of users
What does admin_js.admin.badges.trigger_type.user_change mean in Discourse?
Grant Custom Badge Upon Reading ToS
Set badges to be auto granted?
Access to category after 10 posts (automatic group membership)
Add badge for adding profile picture
How do you assign a badge automatically as soon as someone is added to a group?
Moderator - Badges, Stars, etc. - Positive Feedback?
Hidden Settings on Discourse Hosted Sites
Require LinkedIn or GitHub account to advance from TL0 to TL1. Possible?
Need some Help with my Triggered Custom Badge Query
Exclude certain categories from the Trust Levels
How does Meta handle the bug reporter badge?
Restricting users to join any one private group
An automatic group of group owners
Is it possible to have a badge for 100 solutions?
Grant a badge for all members of a group
Can I change the threshold of the Solved badges?
Grant badges through Automation
What is the 'backfill`?