func (s *Server) resolveRoom(ctx scope.Context, prefix, roomName string, client *proto.Client) (room proto.Room, err error) { // TODO: support room creation? switch prefix { case "pm:": var ( sf snowflake.Snowflake roomKey *security.ManagedKey ) if err := sf.FromString(roomName); err != nil { return nil, proto.ErrRoomNotFound } room, roomKey, err = s.b.PMTracker().Room(ctx, s.kms, sf, client) if err != nil { switch err { case proto.ErrAccessDenied, proto.ErrPMNotFound: return nil, proto.ErrRoomNotFound default: return nil, err } } client.Authorization.AddMessageKey("pm:"+roomName, roomKey) return room, nil case "": room, err = s.b.GetRoom(ctx, roomName) if s.allowRoomCreation && err == proto.ErrRoomNotFound { room, err = s.b.CreateRoom(ctx, s.kms, false, roomName) } if err != nil { return nil, err } if err := client.RoomAuthorize(ctx, room); err != nil { return nil, err } return room, nil default: return nil, proto.ErrRoomNotFound } }