quassellogs/logsHandler.go

97 lines
2.7 KiB
Go

package main
import (
"context"
"fmt"
"net/http"
"net/url"
"strings"
"time"
"github.com/jackc/pgx/v4"
)
type MessageText struct {
t *string
}
type Message struct {
t int
time time.Time
userid int
buffername string
sender string
message string
}
func (mt MessageText) Scan(src interface{}) error {
switch v := src.(type) {
case string:
*mt.t = v
case []byte:
*mt.t = string(v)
case nil:
*mt.t = ""
default:
*mt.t = ""
}
return nil
}
func logsHandler (w http.ResponseWriter, r *http.Request){
rr := rq{w,r}
if isAuthed,user := testAuth(rr,users); isAuthed {
con,err := pgx.Connect(context.Background(), config.Database)
if err != nil {
fmt.Println(err)
}
defer con.Close(context.Background())
channel,err := url.PathUnescape( strings.Split(r.RequestURI,"/")[2] )
if err != nil {
fmt.Println(err)
w.WriteHeader(503)
w.Write([]byte("Could not decode url"))
}
var uid int
err = con.QueryRow(context.Background(), "select userid from quasseluser where username=$1",user).Scan(&uid)
if err != nil {
fmt.Println(err)
}
if uid != 0 {
rows,err := con.Query(context.Background(), "select * from (select backlog.type, backlog.time, buffer.userid, buffer.buffername, sender.sender, backlog.message from backlog natural join sender natural join buffer where buffer.userid=$1 and type in (1, 4, 32, 128) and buffer.buffername=$2 order by backlog.time asc) as test;", uid,channel )
defer rows.Close()
if err != nil{
fmt.Println(err)
}
for rows.Next() {
var m Message
err = rows.Scan(&m.t,&m.time,&m.userid,&m.buffername,&m.sender,MessageText{&m.message})
if err != nil {
fmt.Println(err)
}
sendernick := strings.Split(m.sender,"!")
time := m.time.String()
switch m.t {
case 1:
w.Write([]byte(time+" <"+sendernick[0]+"> "+m.message+"\n"))
case 4:
w.Write([]byte(time+" * "+sendernick[0]+" "+m.message+"\n"))
case 32:
w.Write([]byte(time+" "+sendernick[0]+" joined "+m.message+"\n"))
case 128:
w.Write([]byte(time+" "+sendernick[0]+" left: "+m.message+"\n"))
}
}
if rows.Err() != nil {
fmt.Println(rows.Err())
}
}
} else {
authFail(rr)
}
}