diff --git a/db.py b/db.py
index abafec1..ac4999d 100644
--- a/db.py
+++ b/db.py
@@ -122,7 +122,8 @@ class DB(object):
markdown TEXT,
masto_link TEXT,
twit_link TEXT,
- FOREIGN KEY(user_id) REFERENCES user(id)
+ FOREIGN KEY(user_id) REFERENCES user(id),
+ UNIQUE(user_id, city) ON CONFLICT IGNORE
);
''')
@@ -134,7 +135,7 @@ class DB(object):
).decode('ascii')
}, self.secret).decode('ascii')
- def confirm(self, token):
+ def confirm(self, token, city):
from user import User
try:
json = jwt.decode(token, self.secret)
@@ -154,7 +155,9 @@ class DB(object):
self.execute("INSERT INTO email (user_id, email) VALUES(?, ?);",
(uid, json['email']))
self.commit()
- return User(uid)
+ user = User(uid)
+ user.set_city(city)
+ return user
def by_email(self, email):
from user import User
@@ -174,7 +177,8 @@ class DB(object):
return dict(city=city,
markdown=markdown,
masto_link=masto_link,
- twit_link=twit_link)
+ twit_link=twit_link,
+ mailinglist=city + "@" + config["web"]["host"])
except TypeError:
return None
diff --git a/frontend.py b/frontend.py
index 5975b2a..43ca54d 100755
--- a/frontend.py
+++ b/frontend.py
@@ -29,6 +29,7 @@ def register_post():
email = request.forms['email']
password = request.forms['pass']
password_repeat = request.forms['pass-repeat']
+ city = request.forms['city']
except KeyError:
return dict(error='Please, fill the form.')
if password != password_repeat:
@@ -37,11 +38,12 @@ def register_post():
return dict(error='Email address already in use.')
# send confirmation mail
try:
+ # print(url('confirm/' + city + '/%s' % db.user_token(email, password))) # only for local testing
sendmail(
email,
"Confirm your account",
"Complete your registration here: %s" % (
- url('confirm/%s' % db.user_token(email, password))
+ url('confirm/' + city + '/%s' % db.user_token(email, password))
)
)
return dict(info='Confirmation mail sent.')
@@ -50,11 +52,11 @@ def register_post():
return dict(error='Could not send confirmation mail.')
-@get('/confirm/')
+@get('/confirm//')
@view('template/propaganda.tpl')
-def confirm(token):
+def confirm(city, token):
# create db-entry
- if db.confirm(token):
+ if db.confirm(token, city):
# :todo show info "Account creation successful."
redirect('/settings')
return dict(error='Email confirmation failed.')
@@ -76,9 +78,13 @@ def login_post():
@get('/city/')
-@view('template/user-facing.tpl')
+@view('template/city.tpl')
def city_page(city):
- return db.user_facing_properties(city)
+ citydict = db.user_facing_properties(city)
+ if citydict is not None:
+ return citydict
+ redirect('/')
+ return dict(info='There is no Ticketfrei bot in your city yet. Create one yourself!')
@get('/settings')
diff --git a/promotion/vag-zeitung.xcf b/promotion/vag-zeitung.xcf
new file mode 100644
index 0000000..d86346f
Binary files /dev/null and b/promotion/vag-zeitung.xcf differ
diff --git a/template/city.tpl b/template/city.tpl
new file mode 100644
index 0000000..d102660
--- /dev/null
+++ b/template/city.tpl
@@ -0,0 +1,4 @@
+% rebase('template/wrapper.tpl')
+
+$markdown.render()
+
diff --git a/template/register-plain.tpl b/template/register-plain.tpl
index df26372..57cc637 100644
--- a/template/register-plain.tpl
+++ b/template/register-plain.tpl
@@ -2,6 +2,9 @@
+
+
+
diff --git a/template/settings.tpl b/template/settings.tpl
index 1d34116..32ab147 100644
--- a/template/settings.tpl
+++ b/template/settings.tpl
@@ -7,7 +7,7 @@
Log in with Twitter
@@ -63,10 +63,22 @@
-
+
+
Edit your city page
+
+ With your bot, we generated you a page, which you can use for promotion: Ticketfrei $city You can change what your users will read there, and adjust it to your
+ needs. You should definitely adjust the Social Media profile links. This is just the default text we
+ suggest:
+
+
+
-
+
Edit your trigger patterns
These words have to be contained in a report.
If none of these expressions is in the report, it will be ignored by the bot.
@@ -74,13 +86,13 @@
-
+
Edit the blacklist
These words are not allowed in reports.
If you encounter spam, you can add more here - the bot will ignore reports which use such words.
@@ -88,7 +100,7 @@
Hat jemand vor kurzem etwas über Kontrolleur*innen gepostet?
-
-
- Wenn ja, dann kauf dir vllt lieber ein Ticket. In Nürnberg haben wir
- die Erfahrung gemacht, dass Kontis normalerweile ungefähr ne Woche
- aktiv sind, ein paar Stunden am Tag. Wenn es also in den letzten
- Stunden einen Bericht gab, pass lieber auf.
-
-
- Wenn nicht, ist es wahrscheinlich kein Problem :)
-
-
-
- Also, wenn du weniger Glück hast, und der erste bist, der einen Kontrolleur
- sieht:
-
-
Was mache ich, wenn ich Kontis sehe?
-
Ganz einfach, du schreibst es den anderen. Das geht entweder
-
-
- mit Mastodon
-
-
- über Twitter
-
-
- oder per Mail, falls ihr kein Social Media habt.
-
-
-
- Schreibe einfach einen Toot oder einen Tweet, der den Bot mentioned, und
- gib an
-
-
-
- Wo du die Kontis gesehen hast
-
-
- Welche Linie sie benutzen und in welche Richtung sie fahren.
-
-
-
Zum Beispiel so:
-
-
-
-
-
- Der Bot wird die Nachricht dann weiterverbreiten, auch zu den anderen
- Netzwerken. Dann können andere Leute das lesen und sicher vor Kontis sein.
-
-
-
Danke, dass du mithilfst, öffentlichen Verkehr für alle sicherzustellen!
-
-
- Kann ich darauf vertrauen, was random stranger from the Internet mir da
- erzählen?
-
-
Aber natürlich! Wir haben Katzenbilder!
-
-
- Glaubt besser nicht, wenn jemand postet, dass die Luft da und da gerade
- rein ist. Das ist vielleicht sogar gut gemeint - aber klar könnte die VAG
- sich hinsetzen und einfach lauter Falschmeldungen posten.
-
-
- Aber Falschmeldungen darüber, dass gerade Kontis i-wo unterwegs sind?
- Das macht keinen Sinn. Im schlimmsten Fall kauft jmd mal eine Fahrkarte
- mehr - aber kann sonst immer schwarz fahren.
-
- Also ja - es macht Sinn, uns zu vertrauen, wenn wir sagen, wo gerade Kontis
- sind.
-
-
Was ist Mastodon und warum sollte ich es benutzen?
-
- Mastodon ist ein dezentrales soziales Netzwerk - so wie Twitter, nur ohne
- Monopol und Zentralismus. Ihr könnt Kurznachrichten (Toots) über alles
- mögliche schreiben, und euch mit anderen austauschen.
-
-
- Mastodon ist Open Source, Privatsphäre-freundlich und relativ sicher vor
- Zensur.
-
-
- Um Mastodon zu benutzen, könnt ihr euch einen Account zB bei einer dieser
- Websiten besorgen:
-
diff --git a/user.py b/user.py
index 40f915a..08fd505 100644
--- a/user.py
+++ b/user.py
@@ -134,6 +134,14 @@ class User(object):
return db.cur.fetchone()[0]
def state(self):
+ # necessary:
+ # - city
+ # - markdown
+ # - goodlist
+ # - blacklist
+ # - logged in with twitter?
+ # - logged in with mastodon?
+ # - enabled?
return dict(foo='bar')
def save_request_token(self, token):
@@ -185,3 +193,99 @@ class User(object):
def get_city(self):
db.execute("SELECT city FROM user WHERE id == ?;", (self.uid, ))
return db.cur.fetchone()[0]
+
+ def set_city(self, city):
+ masto_link = "masto.social/@" + city # get masto_link
+ twit_link = "twitter.com/" + city # get twit_link
+ mailinglist = city + "@" + config['web']['host']
+ markdown = """
+ = Wie funktioniert Ticketfrei? =
+
+ Willst du mithelfen, Ticketkontrolleure zu überwachen?
+ Willst du einen Fahrscheinfreien ÖPNV erkämpfen?
+
+ == Ist es gerade sicher, schwarz zu fahren? ==
+
+ Schau einfach auf das Profil unseres Bots: """ + twit_link + """
+
+ Hat jemand vor kurzem etwas über Kontrolleur*innen gepostet?
+ * Wenn ja, dann kauf dir vllt lieber ein Ticket. In Nürnberg
+ haben wir die Erfahrung gemacht, dass Kontis normalerweile
+ ungefähr ne Woche aktiv sind, ein paar Stunden am Tag. Wenn es
+ also in den letzten Stunden einen Bericht gab, pass lieber
+ auf.
+ * Wenn nicht, ist es wahrscheinlich kein Problem :)
+
+ Wir können natürlich nicht garantieren, dass es sicher ist,
+ also pass trotzdem auf, wer auf dem Bahnsteig steht.
+ Aber je mehr Leute mitmachen, desto eher kannst du dir sicher
+ sein, dass wir sie finden, bevor sie uns finden.
+
+ Also, wenn du weniger Glück hast, und der erste bist, der einen
+ Kontrolleur sieht:
+
+ == Was mache ich, wenn ich Kontis sehe? ==
+
+ Ganz einfach, du schreibst es den anderen. Das geht entweder
+
+
+
+ * Oder per Mail an """ + mailinglist + """, wenn ihr kein
+ Social Media benutzen wollt.
+
+ Schreibe einfach einen Toot oder einen Tweet, der den Bot
+ mentioned, und gib an
+ * Wo du die Kontis gesehen hast
+ * Welche Linie sie benutzen und in welche Richtung sie fahren.
+
+ Zum Beispiel so:
+
+ [[https://github.com/b3yond/ticketfrei/blob/master/guides/tooting_screenshot.png|Screenshot of writing a toot]]
+
+ [[https://github.com/b3yond/ticketfrei/blob/master/guides/toot_screenshot.png|A toot ready to be boosted]]
+
+ Der Bot wird die Nachricht dann weiterverbreiten, auch zu den
+ anderen Netzwerken.
+ Dann können andere Leute das lesen und sicher vor Kontis sein.
+
+ Danke, dass du mithilfst, öffentlichen Verkehr für alle
+ sicherzustellen!
+
+ == Kann ich darauf vertrauen, was random stranger from the
+ Internet mir da erzählen? ==
+
+ Aber natürlich! Wir haben Katzenbilder!
+
+ [[https://lorempixel.com/550/300/cats|Katzenbilder...]]
+
+ Glaubt besser nicht, wenn jemand postet, dass die Luft da und
+ da gerade rein ist.
+ Das ist vielleicht sogar gut gemeint - aber klar könnte die
+ VAG sich hinsetzen und einfach lauter Falschmeldungen posten.
+
+ Aber Falschmeldungen darüber, dass gerade Kontis i-wo unterwegs
+ sind?
+ Das macht keinen Sinn.
+ Im schlimmsten Fall kauft jmd mal eine Fahrkarte mehr - aber
+ kann sonst immer schwarz fahren.
+
+ Also ja - es macht Sinn, uns zu vertrauen, wenn wir sagen, wo
+ gerade Kontis sind.
+
+ == Was ist Mastodon und warum sollte ich es benutzen? ==
+
+ Mastodon ist ein dezentrales soziales Netzwerk - so wie
+ Twitter, nur ohne Monopol und Zentralismus.
+ Ihr könnt Kurznachrichten (Toots) über alles mögliche
+ schreiben, und euch mit anderen austauschen.
+
+ Mastodon ist Open Source, Privatsphäre-freundlich und relativ
+ sicher vor Zensur.
+
+ Um Mastodon zu benutzen, besucht diese Seite:
+ https://joinmastodon.org/
+ """
+ db.execute("""INSERT INTO cities(user_id, city, markdown, masto_link,
+ twit_link) VALUES(?,?,?,?,?)""",
+ (self.uid, city, markdown, masto_link, twit_link))
+ db.commit()