1
- import os
1
+ """
2
+ Main application.
3
+ """
4
+ import asyncio
2
5
import logging
3
- from flask import Flask , jsonify
6
+ import os
7
+ import random
8
+ from typing import List
9
+ import httpx
4
10
from dotenv import load_dotenv
11
+ from flask import Flask , jsonify , request
5
12
from flask_cors import CORS
6
- from utils import integration , katas
13
+ from pydantic import BaseModel
14
+ from utils import katas
7
15
8
16
9
17
# load environment variables from .env
16
24
# initialize Flask app
17
25
app = Flask (__name__ )
18
26
27
+
28
+ class Setting (BaseModel ):
29
+ """ Setting model. """
30
+ label : str
31
+ type : str
32
+ required : bool
33
+ default : str
34
+
35
+
36
+ class MonitorPayload (BaseModel ):
37
+ """ Payload model. """
38
+ channel_id : str
39
+ return_url : str
40
+ settings : List [Setting ]
41
+
42
+
19
43
# list of allowed origins
20
44
allowed_origins = [
21
45
"https://telex.im" ,
30
54
31
55
@app .route ("/" , methods = ["GET" ])
32
56
def root ():
33
- """ Root endpoint returning a JSON message """
57
+ """ Root endpoint returning a JSON message. """
34
58
logger .info ("Root endpoint accessed" )
35
59
return jsonify (
36
60
{
@@ -42,6 +66,76 @@ def root():
42
66
)
43
67
44
68
69
+ @app .route ("/coding_challenge" , methods = ["GET" ])
70
+ def get_coding_challenge ():
71
+ """ Endpoint to get a coding challenge. """
72
+ base_url = request .base_url .rstrip ("/coding_challenge" )
73
+ codewars_base_url = "https://www.codewars.com/kata"
74
+ kata_id = random .choice (katas )
75
+
76
+ kata = f"{ codewars_base_url } /{ kata_id } "
77
+ return jsonify (
78
+ {
79
+ "data" : {
80
+ "date" : {
81
+ "created_at" : "2025-02-18" ,
82
+ "updated_at" : "2025-02-18"
83
+ },
84
+ "descriptions" : {
85
+ "app_description" : "Posts a coding challenge every morning to sharpen developer skills." ,
86
+ "app_logo" : "https://i.postimg.cc/5Nn52jM9/codex.png" ,
87
+ "app_name" : "Codex" ,
88
+ "app_url" : base_url ,
89
+ "background_color" : "#151515"
90
+ },
91
+ "integration_category" : "Development & Code Management" ,
92
+ "integration_type" : "interval" ,
93
+ "is_active" : True ,
94
+ "author" : "Tony B. NYA" ,
95
+ "settings" : [
96
+ {
97
+ "label" : "interval" ,
98
+ "type" : "text" ,
99
+ "required" : True ,
100
+ "default" : "* * * * *"
101
+ }
102
+ ],
103
+ "tick_url" : f"{ kata } /tick" ,
104
+ }
105
+ }
106
+ )
107
+
108
+
109
+ # def coding_challenge(payload: MonitorPayload):
110
+ async def coding_challenge (payload : MonitorPayload ):
111
+ """Monitor websites and send a report to the return URL."""
112
+ codewars_base_url = "https://www.codewars.com/kata"
113
+ kata_id = random .choice (katas )
114
+
115
+ kata = f"{ codewars_base_url } /{ kata_id } "
116
+
117
+ data = {
118
+ "message" : kata ,
119
+ "username" : "Coding Challenge" ,
120
+ "event_name" : "Uptime Check" ,
121
+ "status" : "error"
122
+ }
123
+
124
+ async with httpx .AsyncClient () as client :
125
+ await client .post (payload .return_url , json = data )
126
+
127
+
128
+ @app .route ("/tick" , methods = ["POST" ])
129
+ def tick ():
130
+ """Flask route to handle monitoring requests."""
131
+ try :
132
+ payload = MonitorPayload (** request .json )
133
+ asyncio .create_task (coding_challenge (payload ))
134
+ return jsonify ({"message" : "Coding Challenge delivered" }), 202
135
+ except Exception as e :
136
+ return jsonify ({"error" : str (e )}), 400
137
+
138
+
45
139
if __name__ == "__main__" :
46
140
# load configuration from environment variables
47
141
debug_mode = os .getenv ("FLASK_DEBUG" , "True" ).lower () == "true"
0 commit comments