1// Package cleverbot implements wrapper for the cleverbot.io API.
2package cleverbot
3
4import (
5	"bytes"
6	"encoding/json"
7	"fmt"
8	"io/ioutil"
9	"net/http"
10)
11
12// API Endpoints.
13const (
14	baseURL   = "https://cleverbot.io/1.0/"
15	createURL = baseURL + "create"
16	askURL    = baseURL + "ask"
17)
18
19// New bot instance.
20// "nick" is optional if you did not specify it, a random one is generated for you.
21// A successful call returns err == nil.
22func New(user, key string, nick ...string) (s *Session, err error) {
23	var sessionName string
24	if len(nick) > 0 {
25		sessionName = nick[0]
26	}
27
28	s = &Session{
29		User: user,
30		Key:  key,
31		Nick: sessionName,
32	}
33
34	params, err := json.Marshal(s)
35	if err != nil {
36		return
37	}
38
39	response, err := http.Post(createURL, "application/json", bytes.NewBuffer(params))
40	if err != nil {
41		return
42	}
43
44	body, err := ioutil.ReadAll(response.Body)
45	if err != nil {
46		return
47	}
48
49	m := map[string]string{}
50	err = json.Unmarshal([]byte(body), &m)
51	if err != nil {
52		return
53	}
54
55	if m["status"] == "success" {
56		s.Nick = m["nick"]
57	} else {
58		err = fmt.Errorf(m["status"])
59		return
60	}
61
62	return
63}
64
65// Ask Cleverbot a question, returns Cleverbots response.
66// A successful call returns err == nil.
67func (s *Session) Ask(text string) (output string, err error) {
68
69	s.Text = text
70
71	params, err := json.Marshal(s)
72	if err != nil {
73		return
74	}
75
76	response, err := http.Post(askURL, "application/json", bytes.NewBuffer(params))
77	if err != nil {
78		return
79	}
80
81	body, err := ioutil.ReadAll(response.Body)
82	if err != nil {
83		return
84	}
85
86	m := map[string]string{}
87	err = json.Unmarshal([]byte(body), &m)
88	if err != nil {
89		return
90	}
91
92	if m["status"] != "success" {
93		err = fmt.Errorf(m["status"])
94		return
95	}
96
97	// return the bots asnwer.
98	return m["response"], nil
99}
100