Giter VIP home page Giter VIP logo

telego-questions's Introduction

Telego-questions

This package provides a question middleware that helps to handle users answers on questions

Usage:

package main

import (
	"context"
	"fmt"
	"github.com/mymmrac/telego"
	th "github.com/mymmrac/telego/telegohandler"
	tu "github.com/mymmrac/telego/telegoutil"
	"log"
	"os"
	qnmanager "github.com/DeFaNy/telego-questions/manager"
)

func main() {
	botToken := os.Getenv("TOKEN_HERE")

	ctx := context.Background()

	// Create Bot with debug on
	// Note: Please keep in mind that default logger may expose sensitive information, use in development only
	bot, err := telego.NewBot(botToken, telego.WithDefaultDebugLogger())
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	// Get updates channel
	updates, _ := bot.UpdatesViaLongPolling(nil, telego.WithLongPollingContext(ctx))

	qm := qnmanager.NewManager(ctx)

	// Create bot handler
	bh, _ := th.NewBotHandler(bot, updates)

	bh.Use(qm.Middleware)

	// Handle any message
	bh.HandleMessage(func(bot *telego.Bot, message telego.Message) {
		const questionResponseText = "Hey, %s, how old are you?"
		const result = "Your name is %s and you are a %s y.o."

		chatID := tu.ID(message.Chat.ID)

		text := "Hello, what is your name?"

		smp := tu.Message(chatID, text)

		_, err := bot.SendMessage(smp)
		if err != nil {
			log.Fatalf("failed to send message: %s", err.Error())

			return
		}

		err = qm.NewQuestion(bot, message, func(ctx context.Context, bot *telego.Bot, answer qnmanager.Answer) {
			// Get an answer from user and checking if question chan open
			// There is chan and if you want to ask new question another question 
			// just send a message and call this function
			userNameResponse, isOpen := answer()
			if !isOpen {
				log.Println("question chan was closed")

				return
			}

			chatID := userNameResponse.Chat.ID

			// Create an answer message from bot with user name
			smp := tu.Message(tu.ID(chatID), fmt.Sprintf(questionResponseText, userNameResponse.Text))

			_, err := bot.SendMessage(smp)
			if err != nil {
				log.Println("failed to send question to user")

				return
			}
			
			userAgeResponse, isOpen := answer()
			if !isOpen {
				log.Println("question chan was closed")
				
				return 
			}
			
			smp.WithText(fmt.Sprintf(result, userNameResponse.Text, userAgeResponse.Text))

			_, err = bot.SendMessage(smp)
			if err != nil {
				log.Println("failed to send question to user")

				return
			}

			return
		})
		if err != nil {
			log.Fatalf("failed to create question: %s", err.Error())

			return
		}

		return
	})

	// Stop handling updates on exit
	defer bh.Stop()
	defer bot.StopLongPolling()

	// Start handling updates
	bh.Start()
}

telego-questions's People

Contributors

defany avatar qpyparty avatar

Stargazers

 avatar

Watchers

 avatar

Forkers

qpyparty

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.