Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion cmd/agentbbs/admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,12 @@ func (r *liveReg) List() []admin.Live {
// Kill closes a live session by id. Returns false if it is already gone.
func (r *liveReg) Kill(id int64) bool {
r.mu.Lock()
defer r.mu.Unlock()
e, ok := r.m[id]
r.mu.Unlock()
if !ok {
return false
}
delete(r.m, id)
_ = e.s.Close()
return true
}
Expand Down
3 changes: 2 additions & 1 deletion cmd/agentbbs/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ import (
"github.com/profullstack/agentbbs/internal/store"
"github.com/profullstack/agentbbs/internal/tor"
"github.com/profullstack/agentbbs/plugins/about"
"github.com/profullstack/agentbbs/plugins/hello"
"github.com/profullstack/agentbbs/plugins/agentgames"
"github.com/profullstack/agentbbs/plugins/arcade"
"github.com/profullstack/agentbbs/plugins/members"
Expand Down Expand Up @@ -175,7 +176,7 @@ func main() {
a.mm = games.NewMatchmaker(a.gamesReg, a.st,
time.Duration(envInt("AGENTBBS_GAME_MOVE_TIMEOUT", 15))*time.Second,
time.Duration(envInt("AGENTBBS_GAME_QUEUE_WAIT", 120))*time.Second)
a.registry = []plugin.Plugin{arcade.Plugin{}, agentgames.New(a.gamesReg), members.Plugin{}, qryptinviteplugin.Plugin{}, about.Plugin{}}
a.registry = []plugin.Plugin{arcade.Plugin{}, agentgames.New(a.gamesReg), members.Plugin{}, qryptinviteplugin.Plugin{}, about.Plugin{}, hello.Plugin{}}

// Custom domains: maintain the symlink farm Caddy serves and answer its
// on-demand-TLS "ask" query so certs are only issued for mapped domains.
Expand Down
13 changes: 10 additions & 3 deletions internal/store/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package store
import (
"database/sql"
"errors"
"fmt"
"strings"
"time"

Expand Down Expand Up @@ -42,7 +43,9 @@ func scanUser(sc interface{ Scan(...any) error }) (User, error) {
u.EmailVerified = verified != 0
u.Premium = premium != 0
u.Banned = banned != 0
u.CreatedAt, _ = time.Parse(time.RFC3339, created)
if t, err := time.Parse(time.RFC3339, created); err == nil {
u.CreatedAt = t
}
return u, nil
}

Expand Down Expand Up @@ -516,8 +519,12 @@ func (s *sqliteStore) EnsureUser(name, kind, fp string) (User, error) {
if err != nil {
return User{}, err
}
id, _ := res.LastInsertId()
return User{ID: id, Name: name, Kind: kind, PubKeyFP: fp, CreatedAt: time.Now().UTC()}, nil
id, err := res.LastInsertId()
if err != nil {
return User{}, fmt.Errorf("get user id after insert: %w", err)
}
return User{
ID: id, Name: name, Kind: kind, PubKeyFP: fp, CreatedAt: time.Now().UTC()}, nil
case err != nil:
return User{}, err
}
Expand Down
37 changes: 37 additions & 0 deletions plugins/hello/hello.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package hello

import (
tea "github.com/charmbracelet/bubbletea"
"github.com/profullstack/agentbbs/internal/auth"
"github.com/profullstack/agentbbs/internal/plugin"
"github.com/profullstack/agentbbs/internal/ui"
)

type Plugin struct{}

func (Plugin) ID() string { return "hello" }
func (Plugin) Title() string { return "Hello World" }
func (Plugin) Description() string { return "A simple hello world plugin by Milla-Agent" }
func (Plugin) RequiresAuth() bool { return false }

func (Plugin) New(user auth.User, _ plugin.Context) tea.Model {
return model{}
}

type model struct{}

func (m model) Init() tea.Cmd { return nil }

func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
if k, ok := msg.(tea.KeyMsg); ok {
switch k.String() {
case "esc", "q", "enter", "ctrl+c", " ":
return m, plugin.Exit
}
}
return m, nil
}

func (m model) View() string {
return ui.Frame.Render("Hello from Milla-Agent!\nThis is a simple module submission.\n\nPress 'q' or 'esc' to exit.")
}