mirror of
https://github.com/m1k1o/neko.git
synced 2025-05-01 19:36:22 +02:00
implement mute / unmute.
This commit is contained in:
parent
3d0b245abf
commit
ceb4e0c3f1
3 changed files with 90 additions and 27 deletions
|
@ -6,6 +6,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
oldTypes "github.com/demodesk/neko/internal/http/legacy/types"
|
oldTypes "github.com/demodesk/neko/internal/http/legacy/types"
|
||||||
|
|
||||||
|
@ -20,6 +21,12 @@ var (
|
||||||
ErrBackendRespone = fmt.Errorf("error response from backend")
|
ErrBackendRespone = fmt.Errorf("error response from backend")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type memberStruct struct {
|
||||||
|
member *oldTypes.Member
|
||||||
|
connected bool
|
||||||
|
sent bool
|
||||||
|
}
|
||||||
|
|
||||||
type session struct {
|
type session struct {
|
||||||
logger zerolog.Logger
|
logger zerolog.Logger
|
||||||
serverAddr string
|
serverAddr string
|
||||||
|
@ -33,7 +40,7 @@ type session struct {
|
||||||
lockedControls bool
|
lockedControls bool
|
||||||
lockedLogins bool
|
lockedLogins bool
|
||||||
lockedFileTransfer bool
|
lockedFileTransfer bool
|
||||||
sessions map[string]*oldTypes.Member
|
sessions map[string]*memberStruct
|
||||||
|
|
||||||
connClient *websocket.Conn
|
connClient *websocket.Conn
|
||||||
connBackend *websocket.Conn
|
connBackend *websocket.Conn
|
||||||
|
@ -44,7 +51,7 @@ func newSession(logger zerolog.Logger, serverAddr string) *session {
|
||||||
logger: logger,
|
logger: logger,
|
||||||
serverAddr: serverAddr,
|
serverAddr: serverAddr,
|
||||||
client: http.DefaultClient,
|
client: http.DefaultClient,
|
||||||
sessions: make(map[string]*oldTypes.Member),
|
sessions: make(map[string]*memberStruct),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,7 +88,7 @@ func (s *session) apiReq(method, path string, request, response any) error {
|
||||||
return fmt.Errorf("%w: %s", ErrBackendRespone, apiErr.Message)
|
return fmt.Errorf("%w: %s", ErrBackendRespone, apiErr.Message)
|
||||||
}
|
}
|
||||||
// return raw body if failed to unmarshal
|
// return raw body if failed to unmarshal
|
||||||
return fmt.Errorf("unexpected status code: %d, body: %s", res.StatusCode, body)
|
return fmt.Errorf("unexpected status code: %d, body: %s", res.StatusCode, strings.TrimSpace(string(body)))
|
||||||
}
|
}
|
||||||
|
|
||||||
if res.Body == nil {
|
if res.Body == nil {
|
||||||
|
|
|
@ -314,8 +314,11 @@ func (s *session) wsToBackend(msg []byte) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: No WS equivalent, call HTTP API.
|
return s.apiReq(http.MethodPost, "/api/members/"+request.ID, map[string]any{
|
||||||
return fmt.Errorf("event not implemented: %s", header.Event)
|
"plugins": map[string]any{
|
||||||
|
"chat.can_send": false,
|
||||||
|
},
|
||||||
|
}, nil)
|
||||||
|
|
||||||
case oldEvent.ADMIN_UNMUTE:
|
case oldEvent.ADMIN_UNMUTE:
|
||||||
request := &oldMessage.Admin{}
|
request := &oldMessage.Admin{}
|
||||||
|
@ -324,8 +327,11 @@ func (s *session) wsToBackend(msg []byte) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: No WS equivalent, call HTTP API.
|
return s.apiReq(http.MethodPost, "/api/members/"+request.ID, map[string]any{
|
||||||
return fmt.Errorf("event not implemented: %s", header.Event)
|
"plugins": map[string]any{
|
||||||
|
"chat.can_send": true,
|
||||||
|
},
|
||||||
|
}, nil)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("unknown event type: %s", header.Event)
|
return fmt.Errorf("unknown event type: %s", header.Event)
|
||||||
|
|
|
@ -117,7 +117,7 @@ func (s *session) wsToClient(msg []byte) error {
|
||||||
//
|
//
|
||||||
|
|
||||||
membersList := []*oldTypes.Member{}
|
membersList := []*oldTypes.Member{}
|
||||||
s.sessions = map[string]*oldTypes.Member{}
|
s.sessions = map[string]*memberStruct{}
|
||||||
for id, session := range request.Sessions {
|
for id, session := range request.Sessions {
|
||||||
if !session.State.IsConnected {
|
if !session.State.IsConnected {
|
||||||
continue
|
continue
|
||||||
|
@ -127,7 +127,11 @@ func (s *session) wsToClient(msg []byte) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
membersList = append(membersList, member)
|
membersList = append(membersList, member)
|
||||||
s.sessions[id] = member
|
s.sessions[id] = &memberStruct{
|
||||||
|
sent: member.Name != "",
|
||||||
|
connected: true,
|
||||||
|
member: member,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = s.toClient(&oldMessage.MembersList{
|
err = s.toClient(&oldMessage.MembersList{
|
||||||
|
@ -271,7 +275,9 @@ func (s *session) wsToClient(msg []byte) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// only save session - will be notified on connect
|
// only save session - will be notified on connect
|
||||||
s.sessions[request.ID] = member
|
s.sessions[request.ID] = &memberStruct{
|
||||||
|
member: member,
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
|
@ -302,19 +308,48 @@ func (s *session) wsToClient(msg []byte) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// session profile is expected to change when updating a name after connecting
|
// session profile is expected to change when updating a name after connecting
|
||||||
member, ok := s.sessions[request.ID]
|
m, ok := s.sessions[request.ID]
|
||||||
if !ok && member != nil {
|
if !ok || m == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// we only expect the name to be updated, other fields can't be changed
|
// update member profile
|
||||||
member.Name = request.Name
|
member, err := profileToMember(request.ID, request.MemberProfile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
mutedChanged := m.member.Muted != member.Muted
|
||||||
|
m.member = member
|
||||||
|
|
||||||
|
if m.connected && !m.sent && member.Name != "" {
|
||||||
|
m.sent = true
|
||||||
|
|
||||||
// oldEvent.MEMBER_CONNECTED if not sent already
|
// oldEvent.MEMBER_CONNECTED if not sent already
|
||||||
return s.toClient(&oldMessage.Member{
|
err = s.toClient(&oldMessage.Member{
|
||||||
Event: oldEvent.MEMBER_CONNECTED,
|
Event: oldEvent.MEMBER_CONNECTED,
|
||||||
Member: member,
|
Member: member,
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if mutedChanged && member.Muted {
|
||||||
|
return s.toClient(&oldMessage.AdminTarget{
|
||||||
|
Event: oldEvent.ADMIN_MUTE,
|
||||||
|
ID: "", // TODO: We don't know who (un)muted the user.
|
||||||
|
Target: request.ID,
|
||||||
|
})
|
||||||
|
} else if mutedChanged && !member.Muted {
|
||||||
|
return s.toClient(&oldMessage.AdminTarget{
|
||||||
|
Event: oldEvent.ADMIN_UNMUTE,
|
||||||
|
ID: "", // TODO: We don't know who (un)muted the user.
|
||||||
|
Target: request.ID,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
case event.SESSION_STATE:
|
case event.SESSION_STATE:
|
||||||
request := &message.SessionState{}
|
request := &message.SessionState{}
|
||||||
|
@ -323,20 +358,35 @@ func (s *session) wsToClient(msg []byte) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
member, ok := s.sessions[request.ID]
|
m, ok := s.sessions[request.ID]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if request.IsConnected && member != nil && member.Name != "" {
|
if request.IsConnected {
|
||||||
s.sessions[request.ID] = nil
|
m.connected = true
|
||||||
|
|
||||||
|
if m.member.Muted {
|
||||||
|
err = s.toClient(&oldMessage.AdminTarget{
|
||||||
|
Event: oldEvent.ADMIN_MUTE,
|
||||||
|
ID: "", // TODO: We don't know who (un)muted the user.
|
||||||
|
Target: request.ID,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !m.sent && m.member.Name != "" {
|
||||||
|
m.sent = true
|
||||||
|
|
||||||
// oldEvent.MEMBER_CONNECTED if not sent already
|
// oldEvent.MEMBER_CONNECTED if not sent already
|
||||||
return s.toClient(&oldMessage.Member{
|
return s.toClient(&oldMessage.Member{
|
||||||
Event: oldEvent.MEMBER_CONNECTED,
|
Event: oldEvent.MEMBER_CONNECTED,
|
||||||
Member: member,
|
Member: m.member,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if !request.IsConnected {
|
if !request.IsConnected {
|
||||||
delete(s.sessions, request.ID)
|
delete(s.sessions, request.ID)
|
||||||
|
|
Loading…
Add table
Reference in a new issue