Compare commits
2 Commits
d8599a5287
...
73b0d3f39c
Author | SHA1 | Date |
---|---|---|
diamondburned | 73b0d3f39c | |
diamondburned | ef4cb53185 |
|
@ -3,6 +3,7 @@ package discord
|
||||||
import (
|
import (
|
||||||
"github.com/diamondburned/cchat"
|
"github.com/diamondburned/cchat"
|
||||||
"github.com/diamondburned/cchat-discord/internal/discord/authenticate"
|
"github.com/diamondburned/cchat-discord/internal/discord/authenticate"
|
||||||
|
"github.com/diamondburned/cchat-discord/internal/discord/config"
|
||||||
"github.com/diamondburned/cchat-discord/internal/discord/session"
|
"github.com/diamondburned/cchat-discord/internal/discord/session"
|
||||||
"github.com/diamondburned/cchat/services"
|
"github.com/diamondburned/cchat/services"
|
||||||
"github.com/diamondburned/cchat/text"
|
"github.com/diamondburned/cchat/text"
|
||||||
|
@ -34,3 +35,7 @@ func (Service) AsIconer() cchat.Iconer {
|
||||||
func (Service) AsSessionRestorer() cchat.SessionRestorer {
|
func (Service) AsSessionRestorer() cchat.SessionRestorer {
|
||||||
return session.Restorer
|
return session.Restorer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (Service) AsConfigurator() cchat.Configurator {
|
||||||
|
return config.World
|
||||||
|
}
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -4,7 +4,7 @@ go 1.14
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/diamondburned/arikawa/v2 v2.0.0-20210101083335-169b36126239
|
github.com/diamondburned/arikawa/v2 v2.0.0-20210101083335-169b36126239
|
||||||
github.com/diamondburned/cchat v0.3.15
|
github.com/diamondburned/cchat v0.3.17
|
||||||
github.com/diamondburned/ningen/v2 v2.0.0-20210101084041-d9a5058b63b5
|
github.com/diamondburned/ningen/v2 v2.0.0-20210101084041-d9a5058b63b5
|
||||||
github.com/dustin/go-humanize v1.0.0
|
github.com/dustin/go-humanize v1.0.0
|
||||||
github.com/go-test/deep v1.0.7
|
github.com/go-test/deep v1.0.7
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -132,6 +132,10 @@ github.com/diamondburned/cchat v0.3.14 h1:nDr9DJ1EW3kab4gieE+DLhpvHRws+umWpw5XrO
|
||||||
github.com/diamondburned/cchat v0.3.14/go.mod h1:IlMtF+XIvAJh0GL/2yFdf0/34w+Hdy5A1GgvSwAXtQI=
|
github.com/diamondburned/cchat v0.3.14/go.mod h1:IlMtF+XIvAJh0GL/2yFdf0/34w+Hdy5A1GgvSwAXtQI=
|
||||||
github.com/diamondburned/cchat v0.3.15 h1:BJf8ZiRtDWTGMtQ3QqjNU0H+784WSrkJEpFGkKY5gEw=
|
github.com/diamondburned/cchat v0.3.15 h1:BJf8ZiRtDWTGMtQ3QqjNU0H+784WSrkJEpFGkKY5gEw=
|
||||||
github.com/diamondburned/cchat v0.3.15/go.mod h1:IlMtF+XIvAJh0GL/2yFdf0/34w+Hdy5A1GgvSwAXtQI=
|
github.com/diamondburned/cchat v0.3.15/go.mod h1:IlMtF+XIvAJh0GL/2yFdf0/34w+Hdy5A1GgvSwAXtQI=
|
||||||
|
github.com/diamondburned/cchat v0.3.16 h1:vRF8BeypyQ6yr0wK/odGStrmrbB+1WkNcjIwP+SMZeo=
|
||||||
|
github.com/diamondburned/cchat v0.3.16/go.mod h1:IlMtF+XIvAJh0GL/2yFdf0/34w+Hdy5A1GgvSwAXtQI=
|
||||||
|
github.com/diamondburned/cchat v0.3.17 h1:pGwas8Y0SBU7yg4EQ/MvrbqZhrnRhPBYm1AiRsL147s=
|
||||||
|
github.com/diamondburned/cchat v0.3.17/go.mod h1:IlMtF+XIvAJh0GL/2yFdf0/34w+Hdy5A1GgvSwAXtQI=
|
||||||
github.com/diamondburned/ningen v0.1.1-0.20200621014632-6babb812b249 h1:yP7kJ+xCGpDz6XbcfACJcju4SH1XDPwlrvbofz3lP8I=
|
github.com/diamondburned/ningen v0.1.1-0.20200621014632-6babb812b249 h1:yP7kJ+xCGpDz6XbcfACJcju4SH1XDPwlrvbofz3lP8I=
|
||||||
github.com/diamondburned/ningen v0.1.1-0.20200621014632-6babb812b249/go.mod h1:xW9hpBZsGi8KpAh10TyP+YQlYBo+Xc+2w4TR6N0951A=
|
github.com/diamondburned/ningen v0.1.1-0.20200621014632-6babb812b249/go.mod h1:xW9hpBZsGi8KpAh10TyP+YQlYBo+Xc+2w4TR6N0951A=
|
||||||
github.com/diamondburned/ningen v0.1.1-0.20200708085949-b64e350f3b8c h1:3h/kyk6HplYZF3zLi106itjYJWjbuMK/twijeGLEy2M=
|
github.com/diamondburned/ningen v0.1.1-0.20200708085949-b64e350f3b8c h1:3h/kyk6HplYZF3zLi106itjYJWjbuMK/twijeGLEy2M=
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"github.com/diamondburned/cchat"
|
"github.com/diamondburned/cchat"
|
||||||
"github.com/diamondburned/cchat-discord/internal/discord/channel/shared"
|
"github.com/diamondburned/cchat-discord/internal/discord/channel/shared"
|
||||||
"github.com/diamondburned/cchat-discord/internal/discord/channel/typer"
|
"github.com/diamondburned/cchat-discord/internal/discord/channel/typer"
|
||||||
|
"github.com/diamondburned/cchat-discord/internal/discord/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
type TypingIndicator struct {
|
type TypingIndicator struct {
|
||||||
|
@ -18,6 +19,10 @@ func NewTyping(ch shared.Channel) cchat.TypingIndicator {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ti TypingIndicator) Typing() error {
|
func (ti TypingIndicator) Typing() error {
|
||||||
|
if !config.BroadcastTyping() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
return ti.State.Typing(ti.ID)
|
return ti.State.Typing(ti.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,8 @@ func (nn Nicknamer) Nickname(ctx context.Context, labeler cchat.LabelContainer)
|
||||||
return func() {}, nil
|
return func() {}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nn.tryNicknameLabel(ctx, labeler)
|
||||||
|
|
||||||
return funcutil.JoinCancels(
|
return funcutil.JoinCancels(
|
||||||
nn.State.AddHandler(func(chunks *gateway.GuildMembersChunkEvent) {
|
nn.State.AddHandler(func(chunks *gateway.GuildMembersChunkEvent) {
|
||||||
if chunks.GuildID != nn.GuildID {
|
if chunks.GuildID != nn.GuildID {
|
||||||
|
@ -66,11 +68,9 @@ func (nn Nicknamer) tryNicknameLabel(ctx context.Context, labeler cchat.LabelCon
|
||||||
state := nn.State.WithContext(ctx)
|
state := nn.State.WithContext(ctx)
|
||||||
|
|
||||||
m, err := state.Cabinet.Member(nn.GuildID, nn.userID)
|
m, err := state.Cabinet.Member(nn.GuildID, nn.userID)
|
||||||
if err != nil {
|
if err == nil {
|
||||||
return
|
nn.setMember(labeler, *m)
|
||||||
}
|
}
|
||||||
|
|
||||||
nn.setMember(labeler, *m)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (nn Nicknamer) setMember(labeler cchat.LabelContainer, m discord.Member) {
|
func (nn Nicknamer) setMember(labeler cchat.LabelContainer, m discord.Member) {
|
||||||
|
|
|
@ -3,22 +3,55 @@ package send
|
||||||
import (
|
import (
|
||||||
"github.com/diamondburned/arikawa/v2/api"
|
"github.com/diamondburned/arikawa/v2/api"
|
||||||
"github.com/diamondburned/arikawa/v2/discord"
|
"github.com/diamondburned/arikawa/v2/discord"
|
||||||
|
"github.com/diamondburned/arikawa/v2/utils/json/option"
|
||||||
"github.com/diamondburned/arikawa/v2/utils/sendpart"
|
"github.com/diamondburned/arikawa/v2/utils/sendpart"
|
||||||
"github.com/diamondburned/cchat"
|
"github.com/diamondburned/cchat"
|
||||||
"github.com/diamondburned/cchat-discord/internal/discord/channel/message/send/complete"
|
"github.com/diamondburned/cchat-discord/internal/discord/channel/message/send/complete"
|
||||||
"github.com/diamondburned/cchat-discord/internal/discord/channel/shared"
|
"github.com/diamondburned/cchat-discord/internal/discord/channel/shared"
|
||||||
|
"github.com/diamondburned/cchat-discord/internal/discord/config"
|
||||||
"github.com/diamondburned/cchat-discord/internal/discord/state"
|
"github.com/diamondburned/cchat-discord/internal/discord/state"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
allowAllMention = []api.AllowedMentionType{
|
||||||
|
api.AllowEveryoneMention,
|
||||||
|
api.AllowRoleMention,
|
||||||
|
api.AllowUserMention,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
func WrapMessage(s *state.Instance, msg cchat.SendableMessage) api.SendMessageData {
|
func WrapMessage(s *state.Instance, msg cchat.SendableMessage) api.SendMessageData {
|
||||||
var send = api.SendMessageData{Content: msg.Content()}
|
var send = api.SendMessageData{
|
||||||
if attacher := msg.AsAttachments(); attacher != nil {
|
Content: msg.Content(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if attacher := msg.AsAttacher(); attacher != nil {
|
||||||
send.Files = addAttachments(attacher.Attachments())
|
send.Files = addAttachments(attacher.Attachments())
|
||||||
}
|
}
|
||||||
|
|
||||||
if noncer := msg.AsNoncer(); noncer != nil {
|
if noncer := msg.AsNoncer(); noncer != nil {
|
||||||
send.Nonce = s.Nonces.Generate(noncer.Nonce())
|
send.Nonce = s.Nonces.Generate(noncer.Nonce())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if replier := msg.AsReplier(); replier != nil {
|
||||||
|
id, err := discord.ParseSnowflake(replier.ReplyingTo())
|
||||||
|
if err != nil {
|
||||||
|
return send
|
||||||
|
}
|
||||||
|
|
||||||
|
send.Reference = &discord.MessageReference{
|
||||||
|
MessageID: discord.MessageID(id),
|
||||||
|
}
|
||||||
|
send.AllowedMentions = &api.AllowedMentions{
|
||||||
|
Parse: allowAllMention,
|
||||||
|
RepliedUser: option.False,
|
||||||
|
}
|
||||||
|
|
||||||
|
if config.MentionOnReply() {
|
||||||
|
send.AllowedMentions.RepliedUser = option.True
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return send
|
return send
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,119 @@
|
||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/diamondburned/cchat"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
var World = ®istry{
|
||||||
|
configs: []config{
|
||||||
|
{"Mention on Reply", true},
|
||||||
|
{"Broadcast Typing", true},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// MentionOnReply returns true if message replies should mention users.
|
||||||
|
func MentionOnReply() bool {
|
||||||
|
return World.get(0).(bool)
|
||||||
|
}
|
||||||
|
|
||||||
|
// BroadcastTyping returns true if typing events should be broadcasted.
|
||||||
|
func BroadcastTyping() bool {
|
||||||
|
return World.get(1).(bool)
|
||||||
|
}
|
||||||
|
|
||||||
|
type config struct {
|
||||||
|
Name string
|
||||||
|
Value interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c config) Marshal(dst map[string]string) error {
|
||||||
|
switch v := c.Value.(type) {
|
||||||
|
case bool:
|
||||||
|
dst[c.Name] = strconv.FormatBool(v)
|
||||||
|
case string:
|
||||||
|
dst[c.Name] = v
|
||||||
|
default:
|
||||||
|
return cchat.ErrInvalidConfigAtField{
|
||||||
|
Key: c.Name,
|
||||||
|
Err: fmt.Errorf("unknown type %T", c.Value),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *config) Unmarshal(src map[string]string) (err error) {
|
||||||
|
strVal, ok := src[c.Name]
|
||||||
|
if !ok {
|
||||||
|
return cchat.ErrInvalidConfigAtField{
|
||||||
|
Key: c.Name, Err: errors.New("missing field"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var v interface{}
|
||||||
|
|
||||||
|
switch c.Value.(type) {
|
||||||
|
case bool:
|
||||||
|
v, err = strconv.ParseBool(strVal)
|
||||||
|
case string:
|
||||||
|
v = strVal
|
||||||
|
default:
|
||||||
|
err = fmt.Errorf("unknown type %T", c.Value)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return cchat.ErrInvalidConfigAtField{
|
||||||
|
Key: c.Name,
|
||||||
|
Err: err,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Value = v
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type registry struct {
|
||||||
|
mutex sync.RWMutex
|
||||||
|
configs []config
|
||||||
|
}
|
||||||
|
|
||||||
|
func (reg *registry) get(i int) interface{} {
|
||||||
|
reg.mutex.RLock()
|
||||||
|
defer reg.mutex.RUnlock()
|
||||||
|
|
||||||
|
return reg.configs[i].Value
|
||||||
|
}
|
||||||
|
|
||||||
|
func (reg *registry) Configuration() (map[string]string, error) {
|
||||||
|
reg.mutex.RLock()
|
||||||
|
defer reg.mutex.RUnlock()
|
||||||
|
|
||||||
|
var configMap = map[string]string{}
|
||||||
|
|
||||||
|
for _, config := range reg.configs {
|
||||||
|
if err := config.Marshal(configMap); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return configMap, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (reg *registry) SetConfiguration(cfgMap map[string]string) error {
|
||||||
|
reg.mutex.Lock()
|
||||||
|
defer reg.mutex.Unlock()
|
||||||
|
|
||||||
|
for i := range reg.configs {
|
||||||
|
// reference the config inside the slice
|
||||||
|
if err := reg.configs[i].Unmarshal(cfgMap); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
package message
|
package message
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/diamondburned/arikawa/v2/discord"
|
"github.com/diamondburned/arikawa/v2/discord"
|
||||||
|
@ -171,7 +172,7 @@ func NewMessage(m discord.Message, s *state.Instance, author Author) Message {
|
||||||
refmsg = refmsg[:120] + "..."
|
refmsg = refmsg[:120] + "..."
|
||||||
}
|
}
|
||||||
|
|
||||||
content.Content = refmsg + "\n"
|
content.Content = strings.ReplaceAll(refmsg, "\n", " ") + "\n"
|
||||||
content.Segments = []text.Segment{
|
content.Segments = []text.Segment{
|
||||||
reference.NewMessageSegment(0, len(refmsg), ref.ID),
|
reference.NewMessageSegment(0, len(refmsg), ref.ID),
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package session
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"log"
|
||||||
|
|
||||||
"github.com/diamondburned/arikawa/v2/gateway"
|
"github.com/diamondburned/arikawa/v2/gateway"
|
||||||
"github.com/diamondburned/arikawa/v2/session"
|
"github.com/diamondburned/arikawa/v2/session"
|
||||||
|
@ -84,7 +85,7 @@ func (s *Session) Servers(container cchat.ServersContainer) error {
|
||||||
|
|
||||||
// Set the entire container again once reconnected.
|
// Set the entire container again once reconnected.
|
||||||
s.state.AddHandler(func(*ningen.Connected) {
|
s.state.AddHandler(func(*ningen.Connected) {
|
||||||
s.servers(container)
|
log.Println("[Discord] ningen.Connected received, error:", s.servers(container))
|
||||||
})
|
})
|
||||||
|
|
||||||
return s.servers(container)
|
return s.servers(container)
|
||||||
|
|
Loading…
Reference in New Issue