From 1bdaa1ed4da150c7ae5d417b8d1fd29660f2e3fb Mon Sep 17 00:00:00 2001 From: Danny Hammer Date: Mon, 21 Oct 2024 19:14:53 -0600 Subject: [PATCH 1/2] feat: added support for Discord webhook --- OpenBench/utils.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/OpenBench/utils.py b/OpenBench/utils.py index 7a9eed44..90a68e99 100644 --- a/OpenBench/utils.py +++ b/OpenBench/utils.py @@ -41,6 +41,7 @@ from OpenBench.config import OPENBENCH_CONFIG from OpenBench.models import * from OpenBench.stats import TrinomialSPRT, PentanomialSPRT +from OpenBench.templatetags.mytags import longStatBlock import OpenBench.views @@ -396,6 +397,34 @@ def network_edit(request, engine, network): return OpenBench.views.redirect(request, '/networks/%s' % (network.engine), status='Applied changes') +def notify_webhook(request, test_id): + webhook = open('webhook').read().strip() # Removing trailing whitespace/newline, if present + test = Test.objects.get(id=test_id) + + # Compute stats + lower, elo, upper = OpenBench.stats.Elo(test.results()) + error = max(upper - elo, elo - lower) + elo = OpenBench.templatetags.mytags.twoDigitPrecision(elo) + error = OpenBench.templatetags.mytags.twoDigitPrecision(error) + outcome = 'passed' if test.passed else 'failed' + + # Green if passing, red if failing. + color = 0xFEFF58 + if test.passed: + color = 0x37F769 + elif test.wins < test.losses: + color = 0xFA4E4E + + return requests.post(webhook, json={ + 'username': test.dev_engine, + 'embeds': [{ + 'author': { 'name': test.author }, + 'title': f'Test `{test.dev.name}` vs `{test.base.name}` {outcome}', + 'url': request.build_absolute_uri(f'/test/{test_id}'), + 'color': color, + 'description': f'```\n{longStatBlock(test)}\n```', + }] + }) def update_test(request, machine): @@ -503,4 +532,8 @@ def update_test(request, machine): updated=timezone.now() ) + # Send update to webhook, if it exists + if test.finished and os.path.exists('webhook'): + notify_webhook(request, test_id) + return [{}, { 'stop' : True }][test.finished] From 17b37313e347dae7cc4e9bc9044920cb0c734926 Mon Sep 17 00:00:00 2001 From: Danny Hammer Date: Tue, 19 Nov 2024 23:16:39 -0700 Subject: [PATCH 2/2] feat: webhooks now only ping the test author (username is case-insensitive) --- .gitignore | 2 ++ OpenBench/utils.py | 61 ++++++++++++++++++++++++++-------------------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index d79145a3..ae0e3c57 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ Media/* Media/PGNs/* Media/Networks/* Media/Events/* + +webhooks.json diff --git a/OpenBench/utils.py b/OpenBench/utils.py index 90a68e99..204a24ae 100644 --- a/OpenBench/utils.py +++ b/OpenBench/utils.py @@ -398,33 +398,40 @@ def network_edit(request, engine, network): return OpenBench.views.redirect(request, '/networks/%s' % (network.engine), status='Applied changes') def notify_webhook(request, test_id): - webhook = open('webhook').read().strip() # Removing trailing whitespace/newline, if present test = Test.objects.get(id=test_id) - - # Compute stats - lower, elo, upper = OpenBench.stats.Elo(test.results()) - error = max(upper - elo, elo - lower) - elo = OpenBench.templatetags.mytags.twoDigitPrecision(elo) - error = OpenBench.templatetags.mytags.twoDigitPrecision(error) - outcome = 'passed' if test.passed else 'failed' - - # Green if passing, red if failing. - color = 0xFEFF58 - if test.passed: - color = 0x37F769 - elif test.wins < test.losses: - color = 0xFA4E4E - - return requests.post(webhook, json={ - 'username': test.dev_engine, - 'embeds': [{ - 'author': { 'name': test.author }, - 'title': f'Test `{test.dev.name}` vs `{test.base.name}` {outcome}', - 'url': request.build_absolute_uri(f'/test/{test_id}'), - 'color': color, - 'description': f'```\n{longStatBlock(test)}\n```', - }] - }) + with open('webhooks.json') as webhooks: + webhooks = json.load(webhooks) + # If the test author does not have a webhook, exit now + if test.author.lower() not in webhooks: + return + + # Fetch the specific webhook for this test author + webhook = webhooks[test.author.lower()] + + # Compute stats + lower, elo, upper = OpenBench.stats.Elo(test.results()) + error = max(upper - elo, elo - lower) + elo = OpenBench.templatetags.mytags.twoDigitPrecision(elo) + error = OpenBench.templatetags.mytags.twoDigitPrecision(error) + outcome = 'passed' if test.passed else 'failed' + + # Green if passing, red if failing. + color = 0xFEFF58 + if test.passed: + color = 0x37F769 + elif test.wins < test.losses: + color = 0xFA4E4E + + return requests.post(webhook, json={ + 'username': test.dev_engine, + 'embeds': [{ + 'author': { 'name': test.author }, + 'title': f'Test `{test.dev.name}` vs `{test.base.name}` {outcome}', + 'url': request.build_absolute_uri(f'/test/{test_id}'), + 'color': color, + 'description': f'```\n{longStatBlock(test)}\n```', + }] + }) def update_test(request, machine): @@ -533,7 +540,7 @@ def update_test(request, machine): ) # Send update to webhook, if it exists - if test.finished and os.path.exists('webhook'): + if test.finished and os.path.exists('webhooks.json'): notify_webhook(request, test_id) return [{}, { 'stop' : True }][test.finished]