forked from ticketfrei/ticketfrei
Compare commits
13 commits
Author | SHA1 | Date | |
---|---|---|---|
b3yond | 79f16f13d4 | ||
b3yond | 61097576aa | ||
d1b11fe932 | |||
b3yond | 7a7e8f0a30 | ||
b3yond | e18244e149 | ||
b3yond | 39cf3bd070 | ||
b3yond | 382532cf5c | ||
b3yond | cfb9eabee9 | ||
b3yond | a27d47eb8b | ||
b3yond | e34944fcaa | ||
b3yond | d6db1879f9 | ||
b3yond | 02f117a864 | ||
b3yond | 4882930516 |
12
README.md
12
README.md
|
@ -32,13 +32,15 @@ Today, you can use a Twitter, Mastodon, Telegram, and Mail with the account.
|
||||||
They will communicate with each other; if someone warns others via Mail,
|
They will communicate with each other; if someone warns others via Mail,
|
||||||
Telegram, Twitter and Mastodon users will also see the message. And vice versa.
|
Telegram, Twitter and Mastodon users will also see the message. And vice versa.
|
||||||
|
|
||||||
In version 2, this repository contains a web application. On this website,
|
In version 3, this repository contains a web application. On this website,
|
||||||
people can register an own bot for their city - the website manages multiple
|
people can register an own bot for their city - the website manages multiple
|
||||||
bots for multiple citys. This way, you do not have to host it yourself.
|
bots for multiple citys, which run in parallel. This way, you do not have to
|
||||||
|
host it yourself, if you lack the know-how. But it is easily possible to do so
|
||||||
|
with docker: http://github.com/ticketfrei/docker-ticketfrei/
|
||||||
|
|
||||||
In the promotion folder, you'll find some promotion material you can use to
|
In https://github.com/ticketfrei/promotion, you'll find some promotion material
|
||||||
build up such a community in your city. Unfortunately it is in german - but
|
you can use to build up such a community in your city. Unfortunately it is in
|
||||||
it's editable, feel free to translate it!
|
german - but it's editable, feel free to translate it!
|
||||||
|
|
||||||
Website (our flagship instance): https://ticketfrei.links-tech.org
|
Website (our flagship instance): https://ticketfrei.links-tech.org
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
from bot import Bot
|
from bot import Bot
|
||||||
import logging
|
import logging
|
||||||
from mastodon import Mastodon
|
from mastodon import Mastodon, MastodonServerError
|
||||||
import re
|
import re
|
||||||
from report import Report
|
from report import Report
|
||||||
|
|
||||||
|
@ -25,8 +25,8 @@ class MastodonBot(Bot):
|
||||||
return mentions
|
return mentions
|
||||||
try:
|
try:
|
||||||
notifications = m.notifications()
|
notifications = m.notifications()
|
||||||
except Exception:
|
except MastodonServerError:
|
||||||
logger.error("Unknown Mastodon API Error.", exc_info=True)
|
logger.error("Unknown Mastodon API Error: 502")
|
||||||
return mentions
|
return mentions
|
||||||
for status in notifications:
|
for status in notifications:
|
||||||
if (status['type'] == 'mention' and
|
if (status['type'] == 'mention' and
|
||||||
|
|
|
@ -32,6 +32,12 @@ class TelegramBot(Bot):
|
||||||
logger.error("Unknown Telegram error code: " + str(update))
|
logger.error("Unknown Telegram error code: " + str(update))
|
||||||
return reports
|
return reports
|
||||||
user.save_seen_tg(update.update_id)
|
user.save_seen_tg(update.update_id)
|
||||||
|
if update.message.photo:
|
||||||
|
tb.send_message(
|
||||||
|
update.message.sender.id,
|
||||||
|
"Sending Photos is not supported for privacy reasons. Can "
|
||||||
|
"you describe it as text instead?")
|
||||||
|
continue
|
||||||
if update.message.text.lower() == "/start":
|
if update.message.text.lower() == "/start":
|
||||||
user.add_telegram_subscribers(update.message.sender.id)
|
user.add_telegram_subscribers(update.message.sender.id)
|
||||||
tb.send_message(
|
tb.send_message(
|
||||||
|
|
19
bots/mail/settings.tpl
Normal file
19
bots/mail/settings.tpl
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<h2>Edit your mail subscription page</h2>
|
||||||
|
<p>
|
||||||
|
There is also a page where users can subscribe to mail notifications:
|
||||||
|
<a href="/city/mail/{{city}}" target="_blank">Ticketfrei {{city}}</a>.
|
||||||
|
You can change what your users will read there, and adjust it to your
|
||||||
|
needs.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
So this is the default text we suggest:
|
||||||
|
</p>
|
||||||
|
<form action="/settings/mail_md" method="post">
|
||||||
|
<textarea id="mail_md" rows="20" cols="70" name="mail_md" wrap="physical">{{mail_md}}</textarea>
|
||||||
|
<input name='csrf' value='{{csrf}}' type='hidden' />
|
||||||
|
<input name='confirm' value='Save' type='submit'/>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
51
bots/mastodon/settings.tpl
Normal file
51
bots/mastodon/settings.tpl
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>Log in with Mastodon</h2>
|
||||||
|
<form action="/login/mastodon" method='post'>
|
||||||
|
<label for="email">E-Mail of your Mastodon-Account</label>
|
||||||
|
<input type="text" placeholder="Enter Email" name="email" id="email" required>
|
||||||
|
|
||||||
|
<label for="pass">Mastodon Password</label>
|
||||||
|
<input type="password" placeholder="Enter Password" name="pass" id="pass" required>
|
||||||
|
|
||||||
|
<label>Mastodon instance:
|
||||||
|
<input type='text' name='instance_url' list='instances' placeholder='social.example.net'/>
|
||||||
|
</label>
|
||||||
|
<datalist id='instances'>
|
||||||
|
<option value=''>
|
||||||
|
<option value='anticapitalist.party'>
|
||||||
|
<option value='awoo.space'>
|
||||||
|
<option value='cybre.space'>
|
||||||
|
<option value='mastodon.social'>
|
||||||
|
<option value='glitch.social'>
|
||||||
|
<option value='botsin.space'>
|
||||||
|
<option value='witches.town'>
|
||||||
|
<option value='social.wxcafe.net'>
|
||||||
|
<option value='monsterpit.net'>
|
||||||
|
<option value='mastodon.xyz'>
|
||||||
|
<option value='a.weirder.earth'>
|
||||||
|
<option value='chitter.xyz'>
|
||||||
|
<option value='sins.center'>
|
||||||
|
<option value='dev.glitch.social'>
|
||||||
|
<option value='computerfairi.es'>
|
||||||
|
<option value='niu.moe'>
|
||||||
|
<option value='icosahedron.website'>
|
||||||
|
<option value='hostux.social'>
|
||||||
|
<option value='hyenas.space'>
|
||||||
|
<option value='instance.business'>
|
||||||
|
<option value='mastodon.sdf.org'>
|
||||||
|
<option value='pawoo.net'>
|
||||||
|
<option value='pouet.it'>
|
||||||
|
<option value='scalie.business'>
|
||||||
|
<option value='sleeping.town'>
|
||||||
|
<option value='social.koyu.space'>
|
||||||
|
<option value='sunshinegardens.org'>
|
||||||
|
<option value='vcity.network'>
|
||||||
|
<option value='octodon.social'>
|
||||||
|
<option value='soc.ialis.me'>
|
||||||
|
</datalist>
|
||||||
|
<input name='csrf' value='{{csrf}}' type='hidden' />
|
||||||
|
<input name='confirm' value='Log in' type='submit'/>
|
||||||
|
</form>
|
||||||
|
</section>
|
||||||
|
|
23
bots/telegram/settings.tpl
Normal file
23
bots/telegram/settings.tpl
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
|
||||||
|
<%
|
||||||
|
# todo: hide this part, if there is already a telegram bot connected.
|
||||||
|
%>
|
||||||
|
<div>
|
||||||
|
<h2>Connect with Telegram</h2>
|
||||||
|
<p>
|
||||||
|
If you have a Telegram account, you can register a bot there. Just
|
||||||
|
write to @botfather. There are detailed instructions on
|
||||||
|
<a href="https://botsfortelegram.com/project/the-bot-father/" target="_blank">
|
||||||
|
Bots for Telegram</a>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The botfather will give you an API key - with the API key, Ticketfrei
|
||||||
|
can use the Telegram bot. Enter it here:
|
||||||
|
</p>
|
||||||
|
<form action="/settings/telegram" method="post">
|
||||||
|
<input type="text" name="apikey" placeholder="Telegram bot API key" id="apikey">
|
||||||
|
<input name='csrf' value='{{csrf}}' type='hidden' />
|
||||||
|
<input name='confirm' value='Login with Telegram' type='submit'/>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
10
bots/twitter/settings.tpl
Normal file
10
bots/twitter/settings.tpl
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
|
||||||
|
<a class='button' style="padding: 1.5em;" href="/login/twitter">
|
||||||
|
<picture>
|
||||||
|
<source type='image/webp' sizes='20px' srcset="/static-cb/1517673283/twitter-20.webp 20w,/static-cb/1517673283/twitter-40.webp 40w,/static-cb/1517673283/twitter-80.webp 80w,"/>
|
||||||
|
<source type='image/png' sizes='20px' srcset="/static-cb/1517673283/twitter-20.png 20w,/static-cb/1517673283/twitter-40.png 40w,/static-cb/1517673283/twitter-80.png 80w,"/>
|
||||||
|
<img src="https://patriciaannbridewell.files.wordpress.com/2014/04/official-twitter-logo-tile.png" alt="" />
|
||||||
|
</picture>
|
||||||
|
Log in with Twitter
|
||||||
|
</a>
|
||||||
|
|
0
bots/twitterDMs/settings.tpl
Normal file
0
bots/twitterDMs/settings.tpl
Normal file
|
@ -1,5 +1,6 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
import bottle
|
import bottle
|
||||||
|
from os import listdir, path
|
||||||
from bottle import get, post, redirect, request, response, view
|
from bottle import get, post, redirect, request, response, view
|
||||||
from config import config
|
from config import config
|
||||||
from db import db
|
from db import db
|
||||||
|
|
|
@ -7,86 +7,15 @@
|
||||||
<div id="enablebutton" style="float: right; padding: 2em;" color="red">Enable</div>
|
<div id="enablebutton" style="float: right; padding: 2em;" color="red">Enable</div>
|
||||||
% end
|
% end
|
||||||
|
|
||||||
<a class='button' style="padding: 1.5em;" href="/login/twitter">
|
|
||||||
<picture>
|
|
||||||
<source type='image/webp' sizes='20px' srcset="/static-cb/1517673283/twitter-20.webp 20w,/static-cb/1517673283/twitter-40.webp 40w,/static-cb/1517673283/twitter-80.webp 80w,"/>
|
|
||||||
<source type='image/png' sizes='20px' srcset="/static-cb/1517673283/twitter-20.png 20w,/static-cb/1517673283/twitter-40.png 40w,/static-cb/1517673283/twitter-80.png 80w,"/>
|
|
||||||
<img src="https://patriciaannbridewell.files.wordpress.com/2014/04/official-twitter-logo-tile.png" alt="" />
|
|
||||||
</picture>
|
|
||||||
Log in with Twitter
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<section>
|
|
||||||
<h2>Log in with Mastodon</h2>
|
|
||||||
<form action="/login/mastodon" method='post'>
|
|
||||||
<label for="email">E-Mail of your Mastodon-Account</label>
|
|
||||||
<input type="text" placeholder="Enter Email" name="email" id="email" required>
|
|
||||||
|
|
||||||
<label for="pass">Mastodon Password</label>
|
|
||||||
<input type="password" placeholder="Enter Password" name="pass" id="pass" required>
|
|
||||||
|
|
||||||
<label>Mastodon instance:
|
|
||||||
<input type='text' name='instance_url' list='instances' placeholder='social.example.net'/>
|
|
||||||
</label>
|
|
||||||
<datalist id='instances'>
|
|
||||||
<option value=''>
|
|
||||||
<option value='anticapitalist.party'>
|
|
||||||
<option value='awoo.space'>
|
|
||||||
<option value='cybre.space'>
|
|
||||||
<option value='mastodon.social'>
|
|
||||||
<option value='glitch.social'>
|
|
||||||
<option value='botsin.space'>
|
|
||||||
<option value='witches.town'>
|
|
||||||
<option value='social.wxcafe.net'>
|
|
||||||
<option value='monsterpit.net'>
|
|
||||||
<option value='mastodon.xyz'>
|
|
||||||
<option value='a.weirder.earth'>
|
|
||||||
<option value='chitter.xyz'>
|
|
||||||
<option value='sins.center'>
|
|
||||||
<option value='dev.glitch.social'>
|
|
||||||
<option value='computerfairi.es'>
|
|
||||||
<option value='niu.moe'>
|
|
||||||
<option value='icosahedron.website'>
|
|
||||||
<option value='hostux.social'>
|
|
||||||
<option value='hyenas.space'>
|
|
||||||
<option value='instance.business'>
|
|
||||||
<option value='mastodon.sdf.org'>
|
|
||||||
<option value='pawoo.net'>
|
|
||||||
<option value='pouet.it'>
|
|
||||||
<option value='scalie.business'>
|
|
||||||
<option value='sleeping.town'>
|
|
||||||
<option value='social.koyu.space'>
|
|
||||||
<option value='sunshinegardens.org'>
|
|
||||||
<option value='vcity.network'>
|
|
||||||
<option value='octodon.social'>
|
|
||||||
<option value='soc.ialis.me'>
|
|
||||||
</datalist>
|
|
||||||
<input name='csrf' value='{{csrf}}' type='hidden' />
|
|
||||||
<input name='confirm' value='Log in' type='submit'/>
|
|
||||||
</form>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<%
|
<%
|
||||||
# todo: hide this part, if there is already a telegram bot connected.
|
# import all the settings templates from bots/*/settings.tpl
|
||||||
|
import os
|
||||||
|
bots = os.listdir('bots')
|
||||||
|
|
||||||
|
for bot in bots:
|
||||||
|
include('bots/' + bot + '/settings.tpl', csrf=csrf, city=city)
|
||||||
|
end
|
||||||
%>
|
%>
|
||||||
<div>
|
|
||||||
<h2>Connect with Telegram</h2>
|
|
||||||
<p>
|
|
||||||
If you have a Telegram account, you can register a bot there. Just
|
|
||||||
write to @botfather. There are detailed instructions on
|
|
||||||
<a href="https://botsfortelegram.com/project/the-bot-father/" target="_blank">
|
|
||||||
Bots for Telegram</a>.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
The botfather will give you an API key - with the API key, Ticketfrei
|
|
||||||
can use the Telegram bot. Enter it here:
|
|
||||||
</p>
|
|
||||||
<form action="/settings/telegram" method="post">
|
|
||||||
<input type="text" name="apikey" placeholder="Telegram bot API key" id="apikey">
|
|
||||||
<input name='csrf' value='{{csrf}}' type='hidden' />
|
|
||||||
<input name='confirm' value='Login with Telegram' type='submit'/>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<h2>Edit your city page</h2>
|
<h2>Edit your city page</h2>
|
||||||
|
@ -113,24 +42,6 @@
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
|
||||||
<h2>Edit your mail subscription page</h2>
|
|
||||||
<p>
|
|
||||||
There is also a page where users can subscribe to mail notifications:
|
|
||||||
<a href="/city/mail/{{city}}" target="_blank">Ticketfrei {{city}}</a>.
|
|
||||||
You can change what your users will read there, and adjust it to your
|
|
||||||
needs.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
So this is the default text we suggest:
|
|
||||||
</p>
|
|
||||||
<form action="/settings/mail_md" method="post">
|
|
||||||
<textarea id="mail_md" rows="20" cols="70" name="mail_md" wrap="physical">{{mail_md}}</textarea>
|
|
||||||
<input name='csrf' value='{{csrf}}' type='hidden' />
|
|
||||||
<input name='confirm' value='Save' type='submit'/>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<h2>Edit your trigger patterns</h2>
|
<h2>Edit your trigger patterns</h2>
|
||||||
<p>
|
<p>
|
||||||
|
|
Loading…
Reference in a new issue