package session import ( "net" "ripple/handler" "ripple/transport" "ripple/types" ) type UserSession struct { transport *transport.UserTransport cmdHandlers [256]func(types.ClientRemote, []byte) (byte, []byte) } func NewUserSession( transport *transport.UserTransport, h *handler.UserHandlers, ) *UserSession { s := &UserSession{transport: transport} s.cmdHandlers[0x00] = h.AddAccount s.cmdHandlers[0x01] = h.SetTrustline s.cmdHandlers[0x02] = h.NewPayment s.cmdHandlers[0x03] = h.StartPayment return s } func (s *UserSession) Receive(tx []byte, addr *net.UDPAddr) (types.UserRequest, error) { return s.transport.Receive(tx, addr) } func (s *UserSession) Dispatch(req types.UserRequest) { remote := req.Remote h := s.cmdHandlers[req.Instruction.Command] if h == nil { s.transport.Send(handlerErrorResponse(remote)) return } status, msg := h(remote, req.Instruction.Arguments) s.transport.Send(buildClientResponse(remote, status, msg)) } func buildClientResponse(r types.ClientRemote, status byte, msg []byte) types.UserRequest { return types.UserRequest{ Remote: r, Instruction: types.Instruction{ Command: status, Arguments: msg, }, } } func handlerErrorResponse(r types.ClientRemote) types.UserRequest { return buildClientResponse(r, 0x01, []byte("invalid command")) }