changeset 29:70822d7d17c5

Implement fortunes
author Lewin Bormann <lbo@spheniscida.de>
date Sat, 10 Dec 2016 13:33:40 +0100
parents be37dbe1c05d
children e0ff0aaa6531
files data.sql handlers.go queries.sql scripts/read_csv.sh sql/storage.go sql/todo.go
diffstat 6 files changed, 28 insertions(+), 155 deletions(-) [+]
line wrap: on
line diff
--- a/data.sql	Sat Dec 10 12:54:29 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,137 +0,0 @@
---
--- PostgreSQL database dump
---
-
--- Dumped from database version 9.5.5
--- Dumped by pg_dump version 9.5.5
-
-SET statement_timeout = 0;
-SET lock_timeout = 0;
-SET client_encoding = 'UTF8';
-SET standard_conforming_strings = on;
-SET check_function_bodies = false;
-SET client_min_messages = warning;
-SET row_security = off;
-
-SET search_path = public, pg_catalog;
-
---
--- Data for Name: fortunes; Type: TABLE DATA; Schema: public; Owner: goe_bot
---
-
-COPY fortunes (id, fortune, used, lang) FROM stdin;
-1	Mami, Mami, ich bin jetzt fünfzehn. Wann darf ich mir Tangas und BHs kaufen?' - 'Sei ruhig, Dieter!'	0	de
-2	Mami, Mami, da ist eine Frau im Aquarium und schwimmt mit den Haien! ... Mami?'	0	de
-3	Mami, Mami, darf ich noch etwas mit Opa schaukeln?' - 'Nein, der bleibt so hängen bis die Polizei kommt.'	0	de
-4	Mami, Mami, Opa ist die Treppe runtergefallen!' - 'Ist ja gut, jetzt binde ihm bitte die Schnürsenkel wieder auseinander.'	0	de
-5	Mami, Mami, mein Kopf tut weh!' - 'Halt die Klappe und geh weg von der Dartscheibe.'	0	de
-6	Mami, Mami, ich hab heute wieder mit Opa gespielt!' – 'Aber Kind, du sollst doch nicht so tief im Sandkasten buddeln!'	0	de
-7	Mami, Mami, wie lange muss ich noch unter dem Küchentisch stehen?' - 'Bis nächste Woche, wenn der Schreiner das Tischbein fertig hat.'	0	de
-8	‘Mami, Mami, ich möchte wieder einmal Murmeln spielen.' - 'Kommt nicht in Frage. Opas Glasaugen bleiben im Schrank.'	0	de
-9	Mami, Mami, alle sagen, dass ich so große Zähne habe!' – 'Aber Kind, dass stimmt nicht. Mach jetzt schnell den Mund zu, sonst verkratzt du den Boden!'	0	de
-10	Mami, Mami, ich will nicht immer im Kreis laufen.' - 'Sei still, sonst nagle ich dir den anderen Fuß auch noch fest!'	0	de
-47	Worin liegt der Unterschied zwischen einem Mann und einem Schwein? - Ein Schwein wird nicht nicht zu einem Mann, wenn es betrunken ist.	4	de
-48	Warum kann die Hälfte aller Männer nach dem Geschlechtsverkehr nicht einschlafen? Ist doch klar: Weil sie noch nach Hause fahren müssen!	4	de
-49	Was ist ein Mann, der 80 % seines IQ verloren hat? Ein Witwer.	4	de
-50	Welchen Titel trägt das dünnste Buch der Welt? - Was Männer über Frauen wissen.	4	de
-51	Männer haben einen Schwanz und ein Gehirn. Sie haben leider zu wenig Blut, um beides gleichzeitig zu versorgen!	4	de
-52	Was ist der unsensibelste Teil am Penis? - Der Mann.	4	de
-53	Kind fragt seine Mutter: 'Mama, wo ist denn der Waschlappen?' - Mama: 'Der ist nur mal kurz Zigaretten kaufen!'	4	de
-46	Was sagt ein Mann, der bis über die Gürtellinie im Wasser steht? - 'Das geht über meinen Verstand!'	5	de
-11	Auch wenn sie unmusikalisch sind, pfeifen Sie drauf.	1	de
-12	Was in der Jugend ein Abenteuer war, wird in den späteren Jahren nur noch ein teurer Abend.	1	de
-13	Wer den Kern essen will, muss die Nuss knacken.	1	de
-14	Einige Menschen träumen von dem grossen Glück, andere von Keksen.	1	de
-15	Wenn du glaubst, dass Du eine wertvolle Lebensweisheit auf einem kleinen Zettel in einem 5 Cent Glückskeks findest, hast Du einen an der Waffel.	1	de
-16	Glück gleicht durch Höhe aus, was ihm an Länge fehlt.	1	de
-17	Es gibt Besserwisser, die niemals begreifen, dass man Recht haben und ein Idiot sein kann.	1	de
-18	Abenteuer werden meistens abends teuer.	1	de
-19	Wer sich zum Schaf macht, wundert sich, wenn ihn die Wölfe fressen.	1	de
-20	Diese Nachricht zerstört sich in 10 Sekunden von selbst!	1	de
-21	Geld allein macht nicht unglücklich.	2	de
-22	An den Scheidewegen des Lebens stehen keine Wegweiser.	2	de
-23	Ein Tag ohne Dich ist wie ein Glückskeks ohne Zettel.	2	de
-24	Wer seine Nase hoch trägt, wird leicht daran herum geführt.	2	de
-25	Du bist nicht dumm, du denkst nur anders.	2	de
-26	Du bildungsresistenter Intelligenzallergiker.	2	de
-27	Du hast die Suppe der Weisheit mit einer Gabel gegessen.	2	de
-28	Du bist so dünn, bewerb dich doch als Maskottchen für die Welthungerhilfe.	2	de
-29	Du bist genau so sinnvoll wie ein Sandkasten in der Sahara.	2	de
-30	Du bist zu allem fähig, bist aber für nichts zu gebrauchen.	2	de
-31	Du Evolutionsbremse.	3	de
-32	Ich habe ein Foto von dir an der Kellertür - So kommen mir keine Ratten ins Haus!	3	de
-33	Ich würde mich ja geistig mit dir duellieren, aber wie ich sehe bist du unbewaffnet.	3	de
-34	Ein Tag ohne dich gleicht einem Monat Urlaub.	3	de
-35	Es gibt fast 6 Milliarden Menschen, und ich muss ausgerechnet dir begegnen.	3	de
-36	Wenn Blödheit bremsen würde, könntest du dich den ganzen Tag nicht von der Stelle bewegen!	3	de
-37	Trau nie den leuchtenden Augen eines Mannes! Es könnte auch die Sonne sein, die durch seinen hohlen Kopf scheint!	3	de
-38	Wie nennt man einen gut aussehenden, intelligenten und sensiblen Mann? - Ein Gerücht.	3	de
-39	Vier Worte, die das Ego jedes Mannes zerstören: 'Bist du schon drin?'	3	de
-40	Der ideale Mann raucht nicht, trinkt nicht, flirtet nicht und: Existiert nicht!	3	de
-41	Ein Mann zu seiner Frau: 'Schatzi, ich werde dich zur glücklichsten Frau der Welt machen!' - Daraufhin antwortet sie: 'Ich werde dich vermissen.'	4	de
-42	Warum ist ein Mann wie ein Schneesturm? - Keiner weiss wann er kommt, wie viel Zentimeter er mitbringt und wie lange es dauert.	4	de
-43	Hey! Hast du schon gehört, dass man vom Masturbieren schwerhörig wird?' - 'Wie bitte?'	4	de
-44	Was macht eine Frau morgens mit ihren Arsch? - Sie macht ihm Frühstück und schickt ihn dann zur Arbeit.	4	de
-45	Was ist der Unterschied zwischen einer Tomate und einem Mann? - Die Tomate wird reif!	4	de
-\.
-
-
---
--- Name: fortunes_id_seq; Type: SEQUENCE SET; Schema: public; Owner: goe_bot
---
-
-SELECT pg_catalog.setval('fortunes_id_seq', 53, true);
-
-
---
--- Data for Name: quotes; Type: TABLE DATA; Schema: public; Owner: goe_bot
---
-
-COPY quotes (id, ts, quote, owner, quoted, chat_id) FROM stdin;
-1	2016-12-09 21:33:10.528252	Broccolinudeln!	Martina Goerlich	0	12345
-2	2016-12-09 21:35:02.72149	Das wäre eine Überlegung wert	Bert Bormann	0	12345
-\.
-
-
---
--- Name: quotes_id_seq; Type: SEQUENCE SET; Schema: public; Owner: goe_bot
---
-
-SELECT pg_catalog.setval('quotes_id_seq', 2, true);
-
-
---
--- Data for Name: reminders; Type: TABLE DATA; Schema: public; Owner: goe_bot
---
-
-COPY reminders (id, created, due, description, done, chat_id) FROM stdin;
-\.
-
-
---
--- Name: reminders_id_seq; Type: SEQUENCE SET; Schema: public; Owner: goe_bot
---
-
-SELECT pg_catalog.setval('reminders_id_seq', 1, false);
-
-
---
--- Data for Name: todo; Type: TABLE DATA; Schema: public; Owner: goe_bot
---
-
-COPY todo (id, ts, text, owner, done, chat_id, list) FROM stdin;
-1	2016-12-09 21:54:34.988359	todo 1	Lewin Bormann	f	12345	
-\.
-
-
---
--- Name: todo_id_seq; Type: SEQUENCE SET; Schema: public; Owner: goe_bot
---
-
-SELECT pg_catalog.setval('todo_id_seq', 1, true);
-
-
---
--- PostgreSQL database dump complete
---
-
--- a/handlers.go	Sat Dec 10 12:54:29 2016 +0100
+++ b/handlers.go	Sat Dec 10 13:33:40 2016 +0100
@@ -32,7 +32,7 @@
 var (
 	handlers = map[string]handler{
 		echoCmd:    {echoHandler, "Anfrage zurücksenden"},
-		fortuneCmd: {missingHandler, "Glückskeks"},
+		fortuneCmd: {fortuneHandler, "Glückskeks"},
 		quoteCmd:   {missingHandler, "Zitat speichern/abfragen"},
 		remindCmd:  {missingHandler, "Wecker"},
 		statusCmd:  {statusHandler, "Status anfragen"},
--- a/queries.sql	Sat Dec 10 12:54:29 2016 +0100
+++ b/queries.sql	Sat Dec 10 13:33:40 2016 +0100
@@ -21,5 +21,5 @@
 INSERT INTO todos (text, owner, chat_id) VALUES ($0, $1, $2) RETURNING id;
 -- Select open todo items
 SELECT id, text, owner FROM todo WHERE NOT done AND chat_id = $0 AND list = '' ORDER BY ts;
--- Mark item as done
-UPDATE todo SET done = true WHERE id = $0;
+-- Mark item as done. Returns '0 rows affected' if marking an already finished list item.
+UPDATE todo SET done = true WHERE id = $0 AND NOT done;
--- a/scripts/read_csv.sh	Sat Dec 10 12:54:29 2016 +0100
+++ b/scripts/read_csv.sh	Sat Dec 10 13:33:40 2016 +0100
@@ -1,3 +1,3 @@
 #!/bin/bash
 
-psql -U goe_bot -c "COPY fortunes (fortune) FROM STDIN (FORMAT csv)"
+psql -U goe_bot -c "COPY fortunes (fortune) FROM STDIN (FORMAT csv, QUOTE '/', DELIMITER '\\')"
--- a/sql/storage.go	Sat Dec 10 12:54:29 2016 +0100
+++ b/sql/storage.go	Sat Dec 10 13:33:40 2016 +0100
@@ -38,3 +38,25 @@
 func (s *Storage) Todo(chatID uint64) (Todo, error) {
 	return newTodo(s, chatID)
 }
+
+func (s *Storage) Fortunes() (Fortunes, error) {
+	return newFortunes(s)
+}
+
+// Prepare the given queries. Most objects (Todo, Fortunes, ...) require that their queries
+// be prepared.
+func (s *Storage) prewarm(queries []string) error {
+	for _, q := range queries {
+		if _, ok := s.prepared[q]; !ok {
+			stmt, err := s.db.Prepare(q)
+
+			if err == nil {
+				s.prepared[q] = stmt
+			} else {
+				log.Println("Couldn't prepare:", err)
+				return err
+			}
+		}
+	}
+	return nil
+}
--- a/sql/todo.go	Sat Dec 10 12:54:29 2016 +0100
+++ b/sql/todo.go	Sat Dec 10 13:33:40 2016 +0100
@@ -33,23 +33,11 @@
 // prepare statements. MUST be called before any further use (usually by the Storage object
 // that creates the todo object)
 func (td Todo) prewarm() error {
-	for _, q := range []string{
+	return td.db.prewarm([]string{
 		insertTodo,
 		selectOpenTodos,
 		markTodoDone,
-	} {
-		if _, ok := td.db.prepared[q]; !ok {
-			stmt, err := td.db.db.Prepare(q)
-
-			if err == nil {
-				td.db.prepared[q] = stmt
-			} else {
-				log.Println("Couldn't prepare:", err)
-				return err
-			}
-		}
-	}
-	return nil
+	})
 }
 
 func (td Todo) AddTodo(text, owner string) (uint, error) {