11 Commits
Author SHA1 Message Date
gisle de04d6069b simply and hopefully fix channel leave/join
continuous-integration/drone/push Build is passing
2020-07-20 20:40:55 +02:00
gisle b249a495a4 add more debug stuffs.
continuous-integration/drone/push Build is passing
2020-07-20 20:15:55 +02:00
gisle f4d324da9b fix drone.yml
continuous-integration/drone/push Build is passing
2020-07-17 18:27:03 +02:00
gisle fff73cfe44 add go 1.14 to drone.yml
continuous-integration/drone/push Build is passing
2020-07-17 18:20:23 +02:00
gisle 31885d76f0 fix drone.yml
continuous-integration/drone/push Build is passing
2020-07-17 18:19:11 +02:00
gisle fec21a0045 fix drone.yml 2020-07-17 18:14:19 +02:00
gisle d721112738 migrate irc dependency to github version. 2020-07-17 17:21:18 +02:00
gisle dd51f7fd59 Updated irc dependency 2019-03-17 22:35:16 +01:00
gisle 42e6ca8f26 package: Updated irc dependency to fix ((Remove :01 goofs!*)) parse bug. 2019-01-20 21:15:36 +01:00
gisle 304c645043 handler: Fixed issue caused by trying to post empty post. Root cause is not found, but offending posts will be ignored. 2019-01-20 20:29:31 +01:00
gisle 31fd9f9a56 bot: Added !register command.
the build was successful
2018-12-02 18:40:55 +01:00
13 changed files with 199 additions and 144 deletions
+75 -18
View File
@@ -1,21 +1,78 @@
workspace:
base: /go
path: src/git.aiterp.net/rpdata/logbot3
name: logbot3
pipeline:
docker-release:
image: plugins/docker
repo: vmaple/rpdata-logbot3
auto_tag: true
secrets: [ docker_username, docker_password ]
kind: pipeline
type: docker
steps:
- name: go-build-1.11
image: golang:1.11
commands:
- go mod download
- CGO_ENABLED=0 go build -ldflags "-w -s" .
when:
event: tag
ref: refs/tags/*
docker-release-latest:
image: plugins/docker
repo: vmaple/rpdata-logbot3
tags: latest
secrets: [ docker_username, docker_password ]
event:
exclude:
- tag
- name: go-build-1.12
image: golang:1.12
commands:
- go mod download
- CGO_ENABLED=0 go build -ldflags "-w -s" .
when:
event: tag
ref: refs/tags/*
event:
exclude:
- tag
- name: go-build-1.13
image: golang:1.13
commands:
- go mod download
- CGO_ENABLED=0 go build -ldflags "-w -s" .
when:
event:
exclude:
- tag
- name: go-build-1.14
image: golang:1.14
commands:
- go mod download
- CGO_ENABLED=0 go build -ldflags "-w -s" .
when:
event:
exclude:
- tag
- name: go-test
image: golang:1.14
commands:
- go test -v ./...
- name: docker-release-tag
image: plugins/docker
settings:
auto_tag: true
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: r.vmaple.dev/rpdata/logbot3
registry: r.vmaple.dev
when:
event:
- tag
- name: docker-release-latest
image: plugins/docker
settings:
auto_tag: false
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: r.vmaple.dev/rpdata/logbot3
registry: r.vmaple.dev
when:
event:
- tag
+3 -1
View File
@@ -3,4 +3,6 @@ debug
debug.exe
logbot3
logbot3.exe
vendor/
# Idea
/.idea
+7 -9
View File
@@ -1,29 +1,27 @@
## 1. Build Server
# Use Go 1.11
FROM golang:1.11 AS build
# Use Go 1.14
FROM golang:1.14 AS build
# Load repository into docker
WORKDIR /go/src/git.aiterp.net/rpdata/logbot3/
WORKDIR /project
COPY . .
RUN rm -rf ./vendor
# Load and run dependencies
RUN go get -u github.com/golang/dep/cmd/dep
RUN dep ensure
RUN go get
# Build server and tools (CGO disabled to make them 100% static)
ENV CGO_ENABLED 0
RUN go build -a -installsuffix cgo -ldflags="-s -w" -o /binaries/logbot3 .
RUN go build -a -installsuffix cgo -ldflags="-s -w" -o logbot3 .
## 2. Distribute
# Use alpine linux
FROM alpine:3.8 as main-dist
FROM alpine:3.12 as main-dist
# Install certificates to enable HTTPS GET requests
RUN apk add --no-cache ca-certificates
# Copy build files into final container
COPY --from=build /binaries/* /usr/local/bin/
COPY --from=build /project/logbot3 /usr/local/bin/
# The server is the main entry point
CMD ["/usr/local/bin/logbot3"]
Generated
-26
View File
@@ -1,26 +0,0 @@
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
[[projects]]
branch = "master"
name = "git.aiterp.net/gisle/irc"
packages = [
".",
"ircutil",
"isupport",
"list"
]
revision = "c1e97eb9d2e383147662ddd649fcab1bdaf295b4"
[[projects]]
name = "github.com/dgrijalva/jwt-go"
packages = ["."]
revision = "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e"
version = "v3.2.0"
[solve-meta]
analyzer-name = "dep"
analyzer-version = 1
inputs-digest = "7ef4c9d0736b7eb8e596036446cae5d12a8d7485db1559cfa8ade7ba1bf74263"
solver-name = "gps-cdcl"
solver-version = 1
-38
View File
@@ -1,38 +0,0 @@
# Gopkg.toml example
#
# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
# for detailed Gopkg.toml documentation.
#
# required = ["github.com/user/thing/cmd/thing"]
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
#
# [[constraint]]
# name = "github.com/user/project"
# version = "1.0.0"
#
# [[constraint]]
# name = "github.com/user/project2"
# branch = "dev"
# source = "github.com/myfork/project2"
#
# [[override]]
# name = "github.com/x/y"
# version = "2.4.0"
#
# [prune]
# non-go = false
# go-tests = true
# unused-packages = true
[[constraint]]
branch = "master"
name = "git.aiterp.net/gisle/irc"
[[constraint]]
name = "github.com/dgrijalva/jwt-go"
version = "3.2.0"
[prune]
go-tests = true
unused-packages = true
+8
View File
@@ -0,0 +1,8 @@
module git.aiterp.net/rpdata/logbot3
go 1.13
require (
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/gissleh/irc v0.0.0-20200720173331-512ba5aa6fca
)
+4
View File
@@ -0,0 +1,4 @@
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/gissleh/irc v0.0.0-20200720173331-512ba5aa6fca h1:vTL3kM7PkVnTy77i2/ewaC0VDmSEF7sAOMDTNIs6rKY=
github.com/gissleh/irc v0.0.0-20200720173331-512ba5aa6fca/go.mod h1:h2/fPlbnb11gFpitk0HGxYLgK+bCKGh55QSYNo36X8M=
+39 -40
View File
@@ -6,9 +6,8 @@ import (
"strings"
"time"
"git.aiterp.net/gisle/irc"
"git.aiterp.net/rpdata/logbot3/internal/models"
"git.aiterp.net/rpdata/logbot3/internal/models/channels"
"github.com/gissleh/irc"
)
var botKey = "git.aiterp.net/rpdata/logbot.Bot.key"
@@ -34,6 +33,8 @@ func New(ctx context.Context, nick string, alternatives []string, user string, r
SkipSSLVerification: false,
})
client.AddHandler(handler)
bot := &Bot{
client: client,
channels: make(map[string]*Channel),
@@ -74,6 +75,10 @@ func (bot *Bot) Connect(server string, ssl bool, maxRetries int) (err error) {
return err
}
func (bot *Bot) ClientState() irc.ClientState {
return bot.client.State()
}
func (bot *Bot) addChannel(channelName string) *Channel {
if bot.channels[channelName] != nil {
return bot.channels[channelName]
@@ -112,54 +117,48 @@ func (bot *Bot) runCommands(commands []string, target irc.Target, replacers map[
func (bot *Bot) loop() {
bot.loopCtx, bot.loopCancel = context.WithCancel(bot.ctx)
channelChanges, err := channels.SubscribeLogged(bot.ctx)
if err != nil {
log.Println("Failed to get channel changes:", err)
return
}
ticker := time.NewTicker(time.Second * 10)
defer ticker.Stop()
for {
select {
case channel := <-channelChanges:
case <-ticker.C:
{
channels := []models.Channel{channel}
deadline := time.After(time.Second * 1)
buffering := true
for buffering {
select {
case channel := <-channelChanges:
channels = append(channels, channel)
case <-deadline:
buffering = false
loggedChannels, err := channels.ListLogged(bot.ctx)
if err != nil {
log.Println("Failed to list logged channels:", err)
continue
}
loggedMap := make(map[string]bool)
for _, channel := range loggedChannels {
loggedMap[channel.Name] = true
}
clientMap := make(map[string]bool)
for _, channel := range bot.client.Channels() {
clientMap[channel.Name()] = true
}
joins := make([]string, 0, len(loggedMap))
parts := make([]string, 0, len(clientMap))
for key := range loggedMap {
if !clientMap[key] {
joins = append(joins, key)
}
}
for key := range clientMap {
if !loggedMap[key] {
parts = append(parts, key)
}
}
decisions := make(map[string]bool)
for _, channel := range channels {
decisions[channel.Name] = channel.Logged
}
joins := make([]string, 0, len(decisions))
parts := make([]string, 0, len(decisions))
for channelName, logged := range decisions {
if logged {
if bot.client.Channel(channelName) != nil {
continue
}
joins = append(joins, channelName)
} else {
if bot.client.Channel(channelName) == nil {
continue
}
parts = append(parts, channelName)
}
}
if len(joins) > 0 {
bot.client.Join(joins...)
}
if len(parts) > 0 {
log.Println("Leaving", strings.Join(parts, ", "))
bot.client.Part(parts...)
}
if len(joins) > 0 {
log.Println("Joining", strings.Join(joins, ", "))
bot.client.Join(joins...)
}
}
case <-bot.loopCtx.Done():
+23 -3
View File
@@ -6,7 +6,7 @@ import (
"strings"
"time"
"git.aiterp.net/gisle/irc"
"github.com/gissleh/irc"
"git.aiterp.net/rpdata/logbot3/internal/config"
"git.aiterp.net/rpdata/logbot3/internal/models/channels"
"git.aiterp.net/rpdata/logbot3/internal/models/logs"
@@ -85,8 +85,6 @@ func (channel *Channel) loop() {
select {
case post := <-channel.ch:
{
log.Printf("Received %s post from %s", post.Kind, post.Nick)
// Handle bot commands, or add to queue otherwise.
if cmd := post.botCommand(); cmd != nil {
switch cmd.Verb {
@@ -128,6 +126,25 @@ func (channel *Channel) loop() {
log.Println("Could not set event name:", err)
}
}
case "register":
{
target := channel.client.Channel(channel.name)
if target != nil {
me, ok := target.UserList().User(channel.client.Nick())
if !ok || !strings.ContainsRune(me.Modes, 'o') {
channel.client.Say(channel.name, "This unit has insufficient privileges.")
break
}
chanServNick := config.Get().Names.ChanServ
if chanServNick == "" {
channel.client.Say(channel.name, "This function is not enabled.")
break
}
channel.client.Sayf(chanServNick, "REGISTER %s", target.Name())
}
}
}
} else {
queue = append(queue, post)
@@ -137,6 +154,9 @@ func (channel *Channel) loop() {
}
}
// Posts after here aren't going to be bot commands, so log its reception.
log.Printf("Received %s post from %s", post.Kind, post.Nick)
// Stop here if there's nothing to post.
if len(queue) == 0 {
break
+8 -6
View File
@@ -5,10 +5,9 @@ import (
"os"
"strings"
"git.aiterp.net/rpdata/logbot3/internal/util"
"git.aiterp.net/gisle/irc"
"github.com/gissleh/irc"
"git.aiterp.net/rpdata/logbot3/internal/config"
"git.aiterp.net/rpdata/logbot3/internal/util"
)
func handler(event *irc.Event, client *irc.Client) {
@@ -96,6 +95,12 @@ func handler(event *irc.Event, client *irc.Client) {
text = util.RemoveNPCAttribution(event.Text)
}
// Do not dispatch empty messages.
if len(text) < 1 || len(nick) < 1 || len(kind) < 1 {
log.Println("Ignoring empty message from:", event.Nick)
break
}
// Dispatch it.
bot.handlePost(channel.Name(), ChannelPost{
Account: account,
@@ -134,6 +139,3 @@ func handler(event *irc.Event, client *irc.Client) {
}
}
func init() {
irc.Handle(handler)
}
+9 -2
View File
@@ -14,10 +14,14 @@ type Config struct {
User string `json:"user"`
RealName string `json:"realName"`
} `json:"bot"`
Debug struct {
Enabled bool `json:"enabled"`
Listen string `json:"listen"`
} `json:"debug"`
Server struct {
Address string `json:"server"`
SSL bool `json:"ssl"`
}
} `json:"server"`
API struct {
Endpoint string `json:"endpoint"`
Username string `json:"username"`
@@ -29,7 +33,10 @@ type Config struct {
Commands struct {
OnJoinOp []string `json:"onJoinOp"`
OnReady []string `json:"onReady"`
}
} `json:"commands"`
Names struct {
ChanServ string `json:"chanserv"`
} `json:"names"`
}
var mutex sync.Mutex
+4
View File
@@ -28,6 +28,10 @@ func TestRemoveNPCAttribution(t *testing.T) {
Input: "((*Correction))",
Output: "((*Correction))",
},
{
Input: "((Remove :01 goofs!*))",
Output: "((Remove :01 goofs!*))",
},
}
for i, row := range table {
+19 -1
View File
@@ -2,7 +2,9 @@ package main
import (
"context"
"encoding/json"
"log"
"net/http"
"os"
"os/signal"
"strings"
@@ -10,7 +12,6 @@ import (
"git.aiterp.net/rpdata/logbot3/internal/bot"
"git.aiterp.net/rpdata/logbot3/internal/config"
"git.aiterp.net/rpdata/logbot3/internal/models/users"
)
@@ -32,6 +33,23 @@ func main() {
os.Exit(1)
}
if conf.Debug.Enabled {
mux := http.NewServeMux()
mux.HandleFunc("/state", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(200)
_ = json.NewEncoder(w).Encode(bot.ClientState())
})
go func() {
err := http.ListenAndServe(conf.Debug.Listen, mux)
if err != nil {
log.Println("Failed to setup debug listener", err)
}
}()
}
// Listen for a quit signal.
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, os.Interrupt)