mirror of
https://github.com/m1k1o/neko.git
synced 2025-07-14 15:28:17 +02:00
update profile on join.
This commit is contained in:
parent
0f1f218694
commit
679157ef6d
5 changed files with 73 additions and 8 deletions
|
@ -46,6 +46,7 @@ func (api *ApiManagerCtx) Route(r types.Router) {
|
|||
|
||||
r.Post("/logout", api.Logout)
|
||||
r.Get("/whoami", api.Whoami)
|
||||
r.Post("/profile", api.UpdateProfile)
|
||||
|
||||
sessionsHandler := sessions.New(api.sessions)
|
||||
r.Route("/sessions", sessionsHandler.Route)
|
||||
|
|
|
@ -83,3 +83,23 @@ func (api *ApiManagerCtx) Whoami(w http.ResponseWriter, r *http.Request) error {
|
|||
State: session.State(),
|
||||
})
|
||||
}
|
||||
|
||||
func (api *ApiManagerCtx) UpdateProfile(w http.ResponseWriter, r *http.Request) error {
|
||||
session, _ := auth.GetSession(r)
|
||||
|
||||
data := &types.MemberProfile{}
|
||||
if err := utils.HttpJsonRequest(w, r, data); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err := api.sessions.Update(session.ID(), *data)
|
||||
if err != nil {
|
||||
if errors.Is(err, types.ErrSessionNotFound) {
|
||||
return utils.HttpBadRequest("session does not exist")
|
||||
} else {
|
||||
return utils.HttpInternalServerError().WithInternalErr(err)
|
||||
}
|
||||
}
|
||||
|
||||
return utils.HttpSuccess(w, true)
|
||||
}
|
||||
|
|
|
@ -45,8 +45,15 @@ func (s *session) wsToBackend(msg []byte) error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
´
|
||||
if request.DisplayName != "" {
|
||||
s.profile.Name = request.DisplayName
|
||||
|
||||
// TODO: Set Display Name here.
|
||||
err = s.apiReq(http.MethodPost, "/api/profile", s.profile, nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return s.toBackend(event.SIGNAL_ANSWER, &message.SignalDescription{
|
||||
SDP: request.SDP,
|
||||
|
|
|
@ -18,21 +18,21 @@ import (
|
|||
"github.com/demodesk/neko/pkg/types/message"
|
||||
)
|
||||
|
||||
func sessionDataToMember(id string, session message.SessionData) (*oldTypes.Member, error) {
|
||||
func profileToMember(id string, profile types.MemberProfile) (*oldTypes.Member, error) {
|
||||
settings := chat.Settings{
|
||||
CanSend: true, // defaults to true
|
||||
CanReceive: true, // defaults to true
|
||||
}
|
||||
|
||||
err := session.Profile.Plugins.Unmarshal(chat.PluginName, &settings)
|
||||
err := profile.Plugins.Unmarshal(chat.PluginName, &settings)
|
||||
if err != nil && !errors.Is(err, types.ErrPluginSettingsNotFound) {
|
||||
return nil, fmt.Errorf("unable to unmarshal %s plugin settings from global settings: %w", chat.PluginName, err)
|
||||
}
|
||||
|
||||
return &oldTypes.Member{
|
||||
ID: id,
|
||||
Name: session.Profile.Name,
|
||||
Admin: session.Profile.IsAdmin,
|
||||
Name: profile.Name,
|
||||
Admin: profile.IsAdmin,
|
||||
Muted: !settings.CanSend,
|
||||
}, nil
|
||||
}
|
||||
|
@ -122,7 +122,7 @@ func (s *session) wsToClient(msg []byte) error {
|
|||
if !session.State.IsConnected {
|
||||
continue
|
||||
}
|
||||
member, err := sessionDataToMember(id, session)
|
||||
member, err := profileToMember(id, session.Profile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -265,7 +265,7 @@ func (s *session) wsToClient(msg []byte) error {
|
|||
return err
|
||||
}
|
||||
|
||||
member, err := sessionDataToMember(request.ID, *request)
|
||||
member, err := profileToMember(request.ID, request.Profile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -294,6 +294,28 @@ func (s *session) wsToClient(msg []byte) error {
|
|||
ID: request.ID,
|
||||
})
|
||||
|
||||
case event.SESSION_PROFILE:
|
||||
request := &message.MemberProfile{}
|
||||
err := json.Unmarshal(data.Payload, request)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// session profile is expected to change when updating a name after connecting
|
||||
member, ok := s.sessions[request.ID]
|
||||
if !ok && member != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
// we only expect the name to be updated, other fields can't be changed
|
||||
member.Name = request.Name
|
||||
|
||||
// oldEvent.MEMBER_CONNECTED if not sent already
|
||||
return s.toClient(&oldMessage.Member{
|
||||
Event: oldEvent.MEMBER_CONNECTED,
|
||||
Member: member,
|
||||
})
|
||||
|
||||
case event.SESSION_STATE:
|
||||
request := &message.SessionState{}
|
||||
err := json.Unmarshal(data.Payload, request)
|
||||
|
@ -306,7 +328,7 @@ func (s *session) wsToClient(msg []byte) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
if request.IsConnected && member != nil {
|
||||
if request.IsConnected && member != nil && member.Name != "" {
|
||||
s.sessions[request.ID] = nil
|
||||
|
||||
// oldEvent.MEMBER_CONNECTED if not sent already
|
||||
|
|
|
@ -110,6 +110,21 @@ paths:
|
|||
$ref: '#/components/responses/Unauthorized'
|
||||
'403':
|
||||
$ref: '#/components/responses/Forbidden'
|
||||
/api/profile:
|
||||
post:
|
||||
summary: update current profile without syncing it with member profile (experimental)
|
||||
operationId: profile
|
||||
responses:
|
||||
'204':
|
||||
description: OK
|
||||
'401':
|
||||
$ref: '#/components/responses/Unauthorized'
|
||||
requestBody:
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: '#/components/schemas/MemberProfile'
|
||||
required: true
|
||||
|
||||
#
|
||||
# sessions
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue