view handlers.go @ 17:b7fca64d56d0

Use proper markup for italics
author Lewin Bormann <lbo@spheniscida.de>
date Fri, 09 Dec 2016 22:00:48 +0100
parents 992cc8d12603
children 02dba5e5265e
line wrap: on
line source

package main

import (
	"bytes"
	"fmt"
	"log"
	"strings"
)

const (
	echoCmd    = "echo"
	fortuneCmd = "fortune"
	helpCmd    = "help"
	quoteCmd   = "quote"
	remindCmd  = "remind"
	statusCmd  = "status"
	todoCmd    = "todo"
)

type handler struct {
	fn   (func(message) (string, error))
	desc string
}

var (
	handlers = map[string]handler{
		echoCmd:    {echoHandler, "Anfrage zurücksenden"},
		fortuneCmd: {missingHandler, "Glückskeks"},
		quoteCmd:   {missingHandler, "Zitat speichern/abfragen"},
		remindCmd:  {missingHandler, "Wecker"},
		statusCmd:  {statusHandler, "Status anfragen"},
		todoCmd:    {missingHandler, "Aufgabenliste"},
	}
)

func echoHandler(msg message) (string, error) {
	return msg.Text, nil
}

func missingHandler(msg message) (string, error) {
	return "_tut mir leid, das kann ich noch nicht :(_", nil
}

func unknownCommandHandler(msg message) (string, error) {
	return "_tut mir leid, das verstehe ich nicht (*/help* für Hilfe)_", nil
}

func badFormatHandler(msg message) (string, error) {
	return "_bitte benutze einen Befehl, der mit '/' beginnt!_", nil
}

func helpHandler(message) (string, error) {
	b := bytes.NewBuffer(nil)

	for n, h := range handlers {
		b.WriteString(fmt.Sprintf("*/%-15s*    %s\n", n, h.desc))
	}

	return b.String(), nil
}

func statusHandler(message) (string, error) {
	return srvStatus.String(), nil
}

func dispatch(msg message) (sendMessage, error) {
	text := ""
	var err error

	words := strings.SplitAfter(msg.Text, " ")
	cmd := words[0]

	if strings.HasPrefix(cmd, "/") {
		// set Text to rest of message (without command)
		msg.Text = msg.Text[len(cmd):]
		msg.Text = strings.Trim(msg.Text, " ")

		cmd = cmd[1:]
		cmd = strings.Trim(cmd, " ")

		if cmd == helpCmd { // special case
			text, err = helpHandler(msg)
		} else if h, ok := handlers[cmd]; ok {
			text, err = h.fn(msg)
		} else {
			log.Println("Unknown command", cmd)
			text, err = unknownCommandHandler(msg)
		}
	} else {
		log.Println("Bad format:", msg.Text)
		text, err = badFormatHandler(msg)
	}

	reply := sendMessage{
		Chat_ID:    msg.Chat.ID,
		Parse_Mode: "Markdown",
		Text:       text}

	return reply, err
}