Compare commits
5 commits
43257960aa
...
d31149cfd0
Author | SHA1 | Date | |
---|---|---|---|
![]() |
d31149cfd0 | ||
![]() |
583583ae5f | ||
![]() |
2380f6694d | ||
![]() |
5564c8cbfc | ||
![]() |
09b3d1510b |
1 changed files with 57 additions and 16 deletions
|
@ -9,14 +9,8 @@ import os
|
||||||
import jq
|
import jq
|
||||||
import json
|
import json
|
||||||
|
|
||||||
# TODO(eyJhb): add the following
|
|
||||||
# - example of bash alias
|
|
||||||
# - jq filter parameter documentation
|
|
||||||
# - jq filter example
|
|
||||||
# - easy way to run it ONLY with curl
|
|
||||||
# - e.g. curl notify.fricloud.dk/notify/<simple_token>/msg
|
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
app.url_map.strict_slashes = False
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
@ -175,11 +169,16 @@ def index():
|
||||||
<input type="submit" class="btn btn-primary" name="action" value="Set Default Room ID">
|
<input type="submit" class="btn btn-primary" name="action" value="Set Default Room ID">
|
||||||
<hr>
|
<hr>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label">Token</label>
|
<label class="form-label">Token (dashes are optional)</label>
|
||||||
<input type="text" value="{token}" placeholder="token-not-generated" readonly class="form-control" >
|
<input type="text" value="{token}" placeholder="token-not-generated" readonly class="form-control" onclick="this.select();" >
|
||||||
</div>
|
</div>
|
||||||
<input type="submit" class="btn btn-primary" name="{generate_token_name}" value="{generate_token_value}">
|
<input type="submit" class="btn btn-primary" name="{generate_token_name}" value="{generate_token_value}">
|
||||||
</form>
|
</form>
|
||||||
|
<hr>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label class="form-label">Quick URL</label>
|
||||||
|
<input type="text" value="curl {CONFIG_URL}/notify/{token.replace("-", "")}/mymessage" class="form-control" onclick="this.select();" >
|
||||||
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<p>
|
<p>
|
||||||
This notification service has support for both matrix and email.
|
This notification service has support for both matrix and email.
|
||||||
|
@ -222,9 +221,24 @@ def index():
|
||||||
<td>default room</td>
|
<td>default room</td>
|
||||||
<td>!yREJWHUMJhGROiHbtu:fricloud.dk or #na-offtopic:rend.al</td>
|
<td>!yREJWHUMJhGROiHbtu:fricloud.dk or #na-offtopic:rend.al</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">token</th>
|
||||||
|
<td>Authorization Token</td>
|
||||||
|
<td>empty</td>
|
||||||
|
<td>enable-trade-decide or enabletradedecide</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">jq</th>
|
||||||
|
<td>jq filter</td>
|
||||||
|
<td>.</td>
|
||||||
|
<td>[.[].commits | .name ] | join("\\n")</td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
|
bash alias
|
||||||
|
<pre class="border"><code>notify() {{ curl "{CONFIG_URL}/notify/{token}" -g --data-urlencode "body=${{1:-}}"; }}</code></pre>
|
||||||
curl
|
curl
|
||||||
<pre class="border"><code>curl "{CONFIG_URL}/notify" -H "Authorization: Bearer {token}"</code></pre>
|
<pre class="border"><code>curl "{CONFIG_URL}/notify" -H "Authorization: Bearer {token}"</code></pre>
|
||||||
curl w/ specific body/title
|
curl w/ specific body/title
|
||||||
|
@ -240,6 +254,27 @@ def index():
|
||||||
doCheck = false;
|
doCheck = false;
|
||||||
}} ''{script_example_with_token}'';
|
}} ''{script_example_with_token}'';
|
||||||
</code></pre>
|
</code></pre>
|
||||||
|
<hr>
|
||||||
|
<h2>Notes</h2>
|
||||||
|
<p>
|
||||||
|
<b>jq</b> is very powerful, and can easily be used to turn webhook data into useful information in a notification.
|
||||||
|
Just append your `jq=<url_encoded_query>`, to your notification URL, and then watch the magic.
|
||||||
|
Below is an example for doing it with Forgejo, when new commits are pushed.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<pre class="border"><code>(.total_commits | tostring)
|
||||||
|
+ " commits pushed to "
|
||||||
|
+ .repository.full_name
|
||||||
|
+ "\n\n" +
|
||||||
|
# format commits
|
||||||
|
([.commits.[]
|
||||||
|
| "- "
|
||||||
|
+ (.message | gsub("[\n\t]"; ""))
|
||||||
|
+ " (" + .author.name + ")" ]
|
||||||
|
| join("\n"))
|
||||||
|
+ "\n\n"
|
||||||
|
+ "Changes: " + .compare_url</code></pre>
|
||||||
|
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
<p class="fs-5">You've successfully loaded up the Bootstrap starter example. It includes <a href="https://getbootstrap.com/">Bootstrap 5</a> via the <a href="https://www.jsdelivr.com/package/npm/bootstrap">jsDelivr CDN</a> and includes an additional CSS and JS file for your own code.</p>
|
<p class="fs-5">You've successfully loaded up the Bootstrap starter example. It includes <a href="https://getbootstrap.com/">Bootstrap 5</a> via the <a href="https://www.jsdelivr.com/package/npm/bootstrap">jsDelivr CDN</a> and includes an additional CSS and JS file for your own code.</p>
|
||||||
|
@ -260,18 +295,23 @@ def index():
|
||||||
return tmpl
|
return tmpl
|
||||||
|
|
||||||
|
|
||||||
@app.route("/notify", methods=["GET", "POST"])
|
@app.route("/notify", methods=["GET", "POST"], defaults={"token": "", "body": ""})
|
||||||
def send_notification():
|
@app.route("/notify/<token>", methods=["GET", "POST"], defaults={"body": ""})
|
||||||
|
@app.route("/notify/<token>/<body>", methods=["GET", "POST"])
|
||||||
|
def send_notification(token: str, body: str):
|
||||||
# default to this
|
# default to this
|
||||||
ntype = request.args.get("type", "matrix")
|
ntype = request.args.get("type", "matrix")
|
||||||
title = request.args.get("title", "Notification")
|
title = request.args.get("title", "Notification")
|
||||||
body = request.args.get("body", request.get_data().decode("utf-8"))
|
body = request.args.get("body", request.get_data().decode("utf-8") or body)
|
||||||
if not body:
|
if not body:
|
||||||
body = " "
|
body = " "
|
||||||
token = request.authorization.token or request.authorization.password
|
|
||||||
|
if request.authorization:
|
||||||
|
token = request.authorization.token or request.authorization.password
|
||||||
|
|
||||||
if not token:
|
if not token:
|
||||||
return (
|
return (
|
||||||
"No token found, please either specify with Authorization: Bearer <token> or HTTPBasic",
|
"No token found, please either specify with Authorization: Bearer <token>, HTTPBasic or in the URL path",
|
||||||
401,
|
401,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -291,7 +331,8 @@ def send_notification():
|
||||||
con = get_db()
|
con = get_db()
|
||||||
cur = con.cursor()
|
cur = con.cursor()
|
||||||
res = cur.execute(
|
res = cur.execute(
|
||||||
"SELECT username FROM tokens WHERE token = ?", (token,)
|
"SELECT username FROM tokens WHERE REPLACE(token, '-', '') = ? OR token = ? ",
|
||||||
|
(token, token),
|
||||||
).fetchone()
|
).fetchone()
|
||||||
|
|
||||||
if not res:
|
if not res:
|
||||||
|
@ -361,7 +402,7 @@ def set_user_default_matrix_room(username: str, roomid: str):
|
||||||
con.commit()
|
con.commit()
|
||||||
|
|
||||||
|
|
||||||
def generate_token(num_words: int = 5) -> str:
|
def generate_token(num_words: int = 3) -> str:
|
||||||
mnemo = Mnemonic("english")
|
mnemo = Mnemonic("english")
|
||||||
words = mnemo.generate(strength=256)
|
words = mnemo.generate(strength=256)
|
||||||
return "-".join(words.split(" ")[0:num_words])
|
return "-".join(words.split(" ")[0:num_words])
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue