very first iteration

This commit is contained in:
da
2016-04-24 03:42:50 +02:00
parent 971bd1d6d4
commit 21eba2d77d
6 changed files with 600 additions and 0 deletions
+48
View File
@@ -0,0 +1,48 @@
package modules
import (
"log"
"strings"
)
type Payload struct {
Channel string `json:"channel"`
IconEmoji string `json:"icon_emoji"`
Text string `json:"text"`
Username string `json:"username"`
}
type WebhookPayload struct {
ChannelID string `json:"channel_id"`
ChannelName string `json:"channel_name"`
ServiceID string `json:"service_id"`
TeamDomain string `json:"team_domain"`
TeamID string `json:"team_id"`
Text string `json:"text"`
Timestamp string `json:"timestamp"`
Token string `json:"token"`
TriggerWord string `json:"trigger_word"`
UserID string `json:"user_id"`
UserName string `json:"user_name"`
}
var (
SayCh chan Payload
MsgHandlers = make(map[string]func(*WebhookPayload))
ModParams = make(map[string]string)
)
func Init(ch chan Payload, params string) {
SayCh = ch
for _, param := range strings.Split(params, "!") {
kv := strings.Split(param, ":")
ModParams[kv[0]] = kv[1]
log.Println(kv[0], kv[1])
}
}
func HandleMessage(payload *WebhookPayload) {
for _, fn := range MsgHandlers {
fn(payload)
}
}
+162
View File
@@ -0,0 +1,162 @@
// ts3.go
package modules
import (
"bufio"
"log"
"net"
"regexp"
"strings"
"time"
)
var (
users = map[string]bool{}
host string
port string
user string
pass string
botname string
channel string
)
func init() {
MsgHandlers["ts3"] = ts3HandleMessage
log.Println("Initializing ts3 module")
go setConfig()
}
func setConfig() {
time.Sleep(5 * time.Second)
host = ModParams["tshost"]
port = ModParams["tsport"]
user = ModParams["tsuser"]
pass = ModParams["tspass"]
botname = ModParams["tsbotname"]
channel = ModParams["tschan"]
go loop()
}
func loop() {
for {
var err error
users, err = getUsers()
if err != nil {
log.Println(err)
log.Println("Trying again in 60 seconds.")
time.Sleep(60 * time.Second)
} else {
break
}
}
for {
if channel == "" { // dont spam if no channel is set
break
}
neu, err := getUsers()
if err != nil {
log.Println(err)
time.Sleep(50 * time.Second)
} else {
for i, _ := range neu {
if users[i] != neu[i] {
SayCh <- GeneratePayload(channel, ":poop:", i+" joined TS3.", botname)
}
}
for i, _ := range users {
if users[i] != neu[i] {
SayCh <- GeneratePayload(channel, ":poop:", i+" left TS3.", botname)
}
}
users = neu
}
time.Sleep(10 * time.Second)
}
}
func ts3HandleMessage(payload *WebhookPayload) {
log.Println("TS3 users requested by " + payload.UserName)
users, _ := getUsers()
var s string
i := 0
s += "Current users on TS3 Server:\n"
for u, _ := range users {
i++
s += "- " + u
if i != len(users) {
s += "\n"
}
}
SayCh <- GeneratePayload("@"+payload.UserName, ":poop:", s, botname)
}
func getUsers() (u map[string]bool, e error) {
conn, err := net.Dial("tcp", host+":"+port)
if err != nil {
return nil, err
}
reader := bufio.NewReader(conn)
writer := bufio.NewWriter(conn)
for i := 0; i < 2; i++ { // get rid of banner
_, _, err := reader.ReadLine()
if err != nil {
if err.Error() == "EOF" {
log.Println("Connection closed by foreign host.")
}
return nil, err
}
}
writer.WriteString("login " + user + " " + pass + "\n")
writer.Flush()
_, _, err = reader.ReadLine() // get rid of "OK" message
if err != nil {
if err.Error() == "EOF" {
log.Println("Connection closed by foreign host.")
}
return nil, err
}
writer.WriteString("use sid=1\n")
writer.Flush()
_, _, err = reader.ReadLine() // get rid of "OK" message
if err != nil {
if err.Error() == "EOF" {
log.Println("Connection closed by foreign host.")
}
return nil, err
}
writer.WriteString("clientlist\n")
writer.Flush()
line, _, err := reader.ReadLine() // get rid of "OK" message
if err != nil {
if err.Error() == "EOF" {
log.Println("Connection closed by foreign host.")
}
return nil, err
}
users_raw := string(line)
re := regexp.MustCompile("client_nickname=(.*?) ")
users_still_raw := re.FindAllString(users_raw, -1)
for i := range users_still_raw {
users_still_raw[i] = strings.Trim(users_still_raw[i], " ")
users_still_raw[i] = strings.Replace(users_still_raw[i], "client_nickname=", "", 1)
users_still_raw[i] = strings.Replace(users_still_raw[i], "\\s", " ", -1)
}
users := make([]string, 0)
for i := range users_still_raw {
if !strings.HasPrefix(users_still_raw[i], "serveradmin from") {
users = append(users, users_still_raw[i])
}
}
result := make(map[string]bool)
for i := range users {
result[users[i]] = true
}
conn.Close()
return result, nil
}
+243
View File
@@ -0,0 +1,243 @@
// flokatirc twitch module rewritten for WGoSlackBot
//
// Copyright (c) 2016 Daniel Aberger <da@ixab.de>
package modules
import (
"encoding/json"
"io/ioutil"
"log"
"net/http"
"strings"
"time"
"dev.ixab.de/WGSWATBP/WGoSlackBot/util"
)
type TwitchChannelObject struct {
_id int `json:"_id"`
_links struct {
Chat string `json:"chat"`
Commercial string `json:"commercial"`
Editors string `json:"editors"`
Features string `json:"features"`
Follows string `json:"follows"`
Self string `json:"self"`
StreamKey string `json:"stream_key"`
Subscriptions string `json:"subscriptions"`
Teams string `json:"teams"`
Videos string `json:"videos"`
} `json:"_links"`
Background interface{} `json:"background"`
Banner string `json:"banner"`
BroadcasterLanguage string `json:"broadcaster_language"`
CreatedAt string `json:"created_at"`
Delay interface{} `json:"delay"`
DisplayName string `json:"display_name"`
Followers int `json:"followers"`
Game string `json:"game"`
Language string `json:"language"`
Logo string `json:"logo"`
Mature bool `json:"mature"`
Name string `json:"name"`
Partner bool `json:"partner"`
ProfileBanner string `json:"profile_banner"`
ProfileBannerBackgroundColor string `json:"profile_banner_background_color"`
Status string `json:"status"`
UpdatedAt string `json:"updated_at"`
URL string `json:"url"`
VideoBanner string `json:"video_banner"`
Views int `json:"views"`
}
type TwitchStreamObject struct {
_links struct {
Channel string `json:"channel"`
Self string `json:"self"`
} `json:"_links"`
Stream struct {
_id int `json:"_id"`
_links struct {
Self string `json:"self"`
} `json:"_links"`
AverageFps float64 `json:"average_fps"`
Channel struct {
_id int `json:"_id"`
_links struct {
Chat string `json:"chat"`
Commercial string `json:"commercial"`
Editors string `json:"editors"`
Features string `json:"features"`
Follows string `json:"follows"`
Self string `json:"self"`
StreamKey string `json:"stream_key"`
Subscriptions string `json:"subscriptions"`
Teams string `json:"teams"`
Videos string `json:"videos"`
} `json:"_links"`
Background interface{} `json:"background"`
Banner string `json:"banner"`
BroadcasterLanguage string `json:"broadcaster_language"`
CreatedAt string `json:"created_at"`
Delay interface{} `json:"delay"`
DisplayName string `json:"display_name"`
Followers int `json:"followers"`
Game string `json:"game"`
Language string `json:"language"`
Logo string `json:"logo"`
Mature bool `json:"mature"`
Name string `json:"name"`
Partner bool `json:"partner"`
ProfileBanner string `json:"profile_banner"`
ProfileBannerBackgroundColor string `json:"profile_banner_background_color"`
Status string `json:"status"`
UpdatedAt string `json:"updated_at"`
URL string `json:"url"`
VideoBanner string `json:"video_banner"`
Views int `json:"views"`
} `json:"channel"`
CreatedAt string `json:"created_at"`
Delay int `json:"delay"`
Game string `json:"game"`
IsPlaylist bool `json:"is_playlist"`
Preview struct {
Large string `json:"large"`
Medium string `json:"medium"`
Small string `json:"small"`
Template string `json:"template"`
} `json:"preview"`
VideoHeight int `json:"video_height"`
Viewers int `json:"viewers"`
} `json:"stream"`
}
var (
twitch = map[string]bool{
"rocketbeanstv": false,
"blizzard": false,
"ea": false,
"warcraft": false,
"starcraft": false,
"bobross": false,
}
twitchapiurlstreams = "https://api.twitch.tv/kraken/streams/"
twitchapiurlchannels = "https://api.twitch.tv/kraken/channels/"
)
func init() {
MsgHandlers["twitch"] = twitchHandleMessage
log.Println("Initializing twitch module")
go pollStreamData()
}
func twitchHandleMessage(payload *WebhookPayload) {
tok := strings.Split(payload.Text, " ")
if len(tok) < 1 {
return
}
switch tok[0] {
case "!twitch":
switch len(tok) {
case 1:
onlinestreams := 0
for streamname, _ := range twitch {
var so TwitchStreamObject
var co TwitchChannelObject
so = getTwitchStreamObject(streamname)
if so.Stream.Game != "" {
onlinestreams++
co = getTwitchChannelObject(streamname)
twitchSendMsg(co, so)
twitch[streamname] = true
} else {
twitch[streamname] = false
}
}
if onlinestreams == 0 {
SayCh <- GeneratePayload("@"+payload.UserName, "", "All streams offline", "Twitch_Bot")
}
case 2:
streamname := tok[1]
var so TwitchStreamObject
var co TwitchChannelObject
so = getTwitchStreamObject(streamname)
if so.Stream.Game != "" {
co = getTwitchChannelObject(streamname)
twitchSendMsg(co, so)
} else {
SayCh <- GeneratePayload("@"+payload.UserName, "", streamname+" not found or offline", "Twitch_Bot")
}
default:
}
default:
}
}
func pollStreamData() {
time.Sleep(10 * time.Second)
for {
for streamname, _ := range twitch {
var so TwitchStreamObject
var co TwitchChannelObject
so = getTwitchStreamObject(streamname)
if so.Stream.Game != "" && !twitch[streamname] {
co = getTwitchChannelObject(streamname)
twitchSendMsg(co, so)
twitch[streamname] = true
} else if so.Stream.Game == "" && twitch[streamname] {
twitch[streamname] = false
}
}
time.Sleep(180 * time.Second)
}
}
func getTwitchStreamObject(streamname string) TwitchStreamObject {
twsurl := twitchapiurlstreams + streamname
var tobj TwitchStreamObject
resp, err := http.Get(twsurl)
if err != nil {
log.Println(err)
} else {
reader, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Println(err)
} else {
defer resp.Body.Close()
json.Unmarshal(reader, &tobj)
return tobj
}
}
return tobj
}
func getTwitchChannelObject(streamname string) TwitchChannelObject {
twcurl := twitchapiurlchannels + streamname
var tcobj TwitchChannelObject
resp2, err := http.Get(twcurl)
if err != nil {
log.Println(err)
} else {
reader2, err := ioutil.ReadAll(resp2.Body)
if err != nil {
log.Println(err)
} else {
defer resp2.Body.Close()
json.Unmarshal(reader2, &tcobj)
return tcobj
}
}
return tcobj
}
func twitchSendMsg(tcobj TwitchChannelObject, tso TwitchStreamObject) {
SayCh <- GeneratePayload("#wgs-spam",
"",
"*"+tso.Stream.Channel.DisplayName+
"*\n*Title:* "+tcobj.Status+
"\n*Viewers:* "+util.NumberToString(tso.Stream.Viewers, '.')+
"\n*Playing:* "+tso.Stream.Game+
"\n"+tcobj.URL+"\n",
"Twitch_Bot")
}
+12
View File
@@ -0,0 +1,12 @@
// utility.go
package modules
func GeneratePayload(target string, icon string, text string, botname string) Payload {
payload := Payload{
Channel: target,
IconEmoji: icon,
Text: text,
Username: botname,
}
return payload
}