2018-01-08 18:59:16 +01:00
|
|
|
# Webhooks for external integrations.
|
2020-01-14 22:06:24 +01:00
|
|
|
import time
|
|
|
|
|
2018-01-08 18:59:16 +01:00
|
|
|
from django.http import HttpRequest, HttpResponse
|
2020-01-14 22:06:24 +01:00
|
|
|
|
2020-08-20 00:32:15 +02:00
|
|
|
from zerver.decorator import webhook_view
|
2018-01-08 18:59:16 +01:00
|
|
|
from zerver.lib.response import json_success
|
2023-09-27 19:01:31 +02:00
|
|
|
from zerver.lib.typed_endpoint import JsonBodyPayload, typed_endpoint
|
2023-08-12 09:34:31 +02:00
|
|
|
from zerver.lib.validator import WildValue, check_float, check_int, check_string, check_union
|
2018-03-17 18:03:42 +01:00
|
|
|
from zerver.lib.webhooks.common import check_send_webhook_message
|
|
|
|
from zerver.models import UserProfile
|
2018-01-08 18:59:16 +01:00
|
|
|
|
2021-02-12 08:19:30 +01:00
|
|
|
MESSAGE_TEMPLATE = (
|
|
|
|
"You are going to derail from goal **{goal_name}** in **{time:0.1f} hours**. "
|
|
|
|
"You need **{limsum}** to avoid derailing.\n"
|
|
|
|
"* Pledge: **{pledge}$** {expression}\n"
|
|
|
|
)
|
|
|
|
|
2019-04-12 04:40:28 +02:00
|
|
|
|
2021-12-17 07:03:22 +01:00
|
|
|
def get_time(payload: WildValue) -> float:
|
|
|
|
losedate = payload["goal"]["losedate"].tame(check_int)
|
2021-02-12 08:19:30 +01:00
|
|
|
time_remaining = (losedate - time.time()) / 3600
|
2018-03-07 19:18:23 +01:00
|
|
|
return time_remaining
|
|
|
|
|
2021-02-12 08:19:30 +01:00
|
|
|
|
2020-10-23 02:43:28 +02:00
|
|
|
@webhook_view("Beeminder")
|
2023-08-12 09:34:31 +02:00
|
|
|
@typed_endpoint
|
2021-02-12 08:19:30 +01:00
|
|
|
def api_beeminder_webhook(
|
|
|
|
request: HttpRequest,
|
|
|
|
user_profile: UserProfile,
|
2023-08-12 09:34:31 +02:00
|
|
|
*,
|
2023-09-27 19:01:31 +02:00
|
|
|
payload: JsonBodyPayload[WildValue],
|
2021-02-12 08:19:30 +01:00
|
|
|
) -> HttpResponse:
|
2021-12-17 07:03:22 +01:00
|
|
|
goal_name = payload["goal"]["slug"].tame(check_string)
|
|
|
|
limsum = payload["goal"]["limsum"].tame(check_string)
|
2022-03-23 01:33:09 +01:00
|
|
|
pledge = payload["goal"]["pledge"].tame(check_union([check_int, check_float]))
|
2018-03-07 19:18:23 +01:00
|
|
|
time_remain = get_time(payload) # time in hours
|
2018-01-08 18:59:16 +01:00
|
|
|
# To show user's probable reaction by looking at pledge amount
|
|
|
|
if pledge > 0:
|
2021-02-12 08:20:45 +01:00
|
|
|
expression = ":worried:"
|
2018-01-08 18:59:16 +01:00
|
|
|
else:
|
2021-02-12 08:20:45 +01:00
|
|
|
expression = ":relieved:"
|
2018-01-08 18:59:16 +01:00
|
|
|
|
2024-01-17 15:53:30 +01:00
|
|
|
topic_name = "beekeeper"
|
2019-04-12 04:40:28 +02:00
|
|
|
body = MESSAGE_TEMPLATE.format(
|
|
|
|
goal_name=goal_name,
|
|
|
|
time=time_remain,
|
|
|
|
limsum=limsum,
|
|
|
|
pledge=pledge,
|
python: Use trailing commas consistently.
Automatically generated by the following script, based on the output
of lint with flake8-comma:
import re
import sys
last_filename = None
last_row = None
lines = []
for msg in sys.stdin:
m = re.match(
r"\x1b\[35mflake8 \|\x1b\[0m \x1b\[1;31m(.+):(\d+):(\d+): (\w+)", msg
)
if m:
filename, row_str, col_str, err = m.groups()
row, col = int(row_str), int(col_str)
if filename == last_filename:
assert last_row != row
else:
if last_filename is not None:
with open(last_filename, "w") as f:
f.writelines(lines)
with open(filename) as f:
lines = f.readlines()
last_filename = filename
last_row = row
line = lines[row - 1]
if err in ["C812", "C815"]:
lines[row - 1] = line[: col - 1] + "," + line[col - 1 :]
elif err in ["C819"]:
assert line[col - 2] == ","
lines[row - 1] = line[: col - 2] + line[col - 1 :].lstrip(" ")
if last_filename is not None:
with open(last_filename, "w") as f:
f.writelines(lines)
Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2020-04-10 05:23:40 +02:00
|
|
|
expression=expression,
|
2019-04-12 04:40:28 +02:00
|
|
|
)
|
2024-01-17 15:53:30 +01:00
|
|
|
check_send_webhook_message(request, user_profile, topic_name, body)
|
2022-01-31 13:44:02 +01:00
|
|
|
return json_success(request)
|