Skip to content
Snippets Groups Projects
Verified Commit f79007aa authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Implement opt-in / opt-out functionality

parent 2e76436e
No related branches found
No related tags found
No related merge requests found
package main package main
import ( import (
"database/sql"
"encoding/hex"
"fmt"
_ "github.com/lib/pq"
"github.com/lrstanley/girc" "github.com/lrstanley/girc"
"golang.org/x/crypto/scrypt"
"log"
"os" "os"
"fmt" "strconv"
"strings" "strings"
"log"
"time" "time"
_ "github.com/lib/pq"
"encoding/hex"
"database/sql"
"strconv"
"golang.org/x/crypto/scrypt"
) )
type Config struct { type Config struct {
...@@ -161,17 +161,96 @@ func main() { ...@@ -161,17 +161,96 @@ func main() {
} }
}) })
client.Handlers.Add(girc.PRIVMSG, func(c *girc.Client, e girc.Event) { client.Handlers.Add(girc.PRIVMSG, func(client *girc.Client, event girc.Event) {
if len(e.Params) == 1 { if len(event.Params) == 1 {
channelName := e.Params[0] channelName := event.Params[0]
if channelData, ok := channels[channelName]; ok { if channelData, ok := channels[channelName]; ok {
now := time.Now().UTC() logMessage(channelData, event, client, channelName, db)
} else if channelName == client.GetNick() {
handlePrivateMessage(channels, event, client, db)
}
}
})
name := hashName(channelData.Salt, e.Source.Name) for {
content := strings.TrimSpace(e.Trailing) if err := client.Connect(); err != nil {
log.Printf("error: %s", err)
channel := c.LookupChannel(channelName) log.Println("reconnecting in 30 seconds...")
time.Sleep(30 * time.Second)
} else {
return
}
}
}
func handlePrivateMessage(channels map[string]IrcChannel, event girc.Event, client *girc.Client, db *sql.DB) {
split := strings.Split(event.Trailing, " ")
if len(split) >= 1 {
command := split[0]
parameters := split[1:]
if strings.EqualFold(command, "OPT-IN") {
if len(parameters) == 1 {
channelName := parameters[0]
if channelData, ok := channels[channelName]; ok {
nick := event.Source.Name
hash := hashName(channelData.Salt, nick)
_, err := db.Exec("INSERT INTO users (hash, nick) VALUES ($1, $2)", hash, nick)
if err != nil {
client.Cmd.Reply(event, "An error has occured, please try later again")
println(err.Error())
} else {
client.Cmd.Reply(event, "Opt-In successful")
}
return
}
client.Cmd.Reply(event, "Channel not found")
}
printUsageOptIn(client, event)
return
} else if strings.EqualFold(command, "OPT-OUT") {
if len(parameters) == 1 {
channelName := parameters[0]
if channelData, ok := channels[channelName]; ok {
nick := event.Source.Name
hash := hashName(channelData.Salt, nick)
_, err := db.Exec("DELETE FROM users WHERE hash = $1 AND nick = $2", hash, nick)
if err != nil {
client.Cmd.Reply(event, "An error has occured, please try later again")
println(err.Error())
} else {
client.Cmd.Reply(event, "Opt-Out successful")
}
return
}
client.Cmd.Reply(event, "Channel not found")
}
printUsageOptOut(client, event)
return
}
}
printUsage(client, event)
}
func printUsage(client *girc.Client, event girc.Event) {
client.Cmd.Reply(event, "Usage:")
client.Cmd.Reply(event, "OPT-IN [channel]")
client.Cmd.Reply(event, "OPT-OUT [channel]")
}
func printUsageOptIn(client *girc.Client, event girc.Event) {
client.Cmd.Reply(event, "Usage: OPT-IN [channel]")
}
func printUsageOptOut(client *girc.Client, event girc.Event) {
client.Cmd.Reply(event, "Usage: OPT-OUT [channel]")
}
func logMessage(channelData IrcChannel, event girc.Event, client *girc.Client, channelName string, db *sql.DB) {
now := time.Now().UTC()
name := hashName(channelData.Salt, event.Source.Name)
content := strings.TrimSpace(event.Trailing)
channel := client.LookupChannel(channelName)
var users []string var users []string
if channel != nil { if channel != nil {
for _, user := range channel.UserList { for _, user := range channel.UserList {
...@@ -180,14 +259,12 @@ func main() { ...@@ -180,14 +259,12 @@ func main() {
} }
} }
} }
for _, user := range users { for _, user := range users {
_, err := db.Exec("INSERT INTO \"references\" (time, source, target) VALUES ($1, $2, $3)", now, name, user) _, err := db.Exec("INSERT INTO \"references\" (time, source, target) VALUES ($1, $2, $3)", now, name, user)
if err != nil { if err != nil {
println(err.Error()) println(err.Error())
} }
} }
message := IrcMessage{ message := IrcMessage{
Time: now, Time: now,
Channel: channelData.Id, Channel: channelData.Id,
...@@ -206,17 +283,3 @@ func main() { ...@@ -206,17 +283,3 @@ func main() {
println(err.Error()) println(err.Error())
} }
} }
}
})
for {
if err := client.Connect(); err != nil {
log.Printf("error: %s", err)
log.Println("reconnecting in 30 seconds...")
time.Sleep(30 * time.Second)
} else {
return
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment