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 @@

- +
diff --git a/template/user-facing.tpl b/template/user-facing.tpl deleted file mode 100644 index ff39204..0000000 --- a/template/user-facing.tpl +++ /dev/null @@ -1,115 +0,0 @@ -% rebase('template/wrapper.tpl') - -

Wie funktioniert Ticketfrei?

-

- Willst du mithelfen, Ticketkontrolleure zu überwachen? Willst du einen - Fahrscheinfreien ÖPNV erkämpfen? -

-

Ist es gerade sicher, schwarz zu fahren?

-

- Schau dir einfach das Profil unseres Bots an: - https://twitter.com/nbg_ticketfrei -

-

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:

- -Screenshot of writing a toot -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!

- -

- 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()