package user import ( "citrons.xyz/talk/server/session" "citrons.xyz/talk/proto" ) func (u *User) SendRequest(r session.Request) { switch r.Cmd.Kind { case "update": if r.From.UserId != u.Id() { r.Reply(proto.Fail{"forbidden", "", nil}.Cmd()) return } if len(r.Cmd.Args) != 1 { r.ReplyInvalid() return } upd := r.Cmd.Args[0] if upd.Kind != "u" { r.ReplyInvalid() return } name := u.name status := u.status for k, v := range upd.Fields { switch k { case "": name = v case "status": status = v default: r.ReplyInvalid() return } } if len(status) > 512 { r.Reply(proto.Fail{"too-long", "", nil}.Cmd()) return } u.status = status if name != u.name { err := u.Rename(name) if err != nil { r.Reply(err.Cmd()) return } } u.Save() u.Stream.Event(r.Cmd) r.ReplyOk() case "auth-update": if r.From.UserId != u.Id() { r.Reply(proto.Fail{"forbidden", "", nil}.Cmd()) return } if !u.anonymous && !r.From.PasswordAuthed { r.Reply(proto.Fail{"password-required", "", nil}.Cmd()) return } if len(r.Cmd.Args) != 1 { r.ReplyInvalid() return } upd := r.Cmd.Args[0] switch upd.Kind { case "password": var password string for k, v := range upd.Fields { switch k { case "": password = v default: r.ReplyInvalid() } } if password == "" { r.ReplyInvalid() return } u.SetPassword(password) r.From.PasswordAuthed = true r.ReplyOk() default: r.ReplyInvalid() return } case "i": r.Reply(proto.NewCmd("i", "", u.InfoFor(r.From.UserId))) case "s": r.From.Subscribe(&u.Stream) r.Reply(proto.NewCmd("i", "", u.InfoFor(r.From.UserId))) case "u": r.From.Unsubscribe(&u.Stream) r.ReplyOk() default: r.ReplyInvalid() } }