Commit 9cc03728 authored by Andrei Mihu's avatar Andrei Mihu
Browse files

Add event hook registration and processing. (#315)

parent a822e444
Loading
Loading
Loading
Loading
+330 −265

File changed.

Preview size limit exceeded, changes collapsed.

+10 −0
Original line number Diff line number Diff line
@@ -288,6 +288,16 @@ message DeleteStorageObjectsRequest {
  repeated DeleteStorageObjectId object_ids = 1;
}

// Represents an event to be passed through the server to registered event handlers.
message Event {
  // An event name, type, category, or identifier.
  string name = 1;
  // Arbitrary event property values.
  map<string, string> properties = 2;
  // The time when the event was triggered.
  google.protobuf.Timestamp timestamp = 3;
}

// A friend of a user.
message Friend {
  // The friendship status.
+7 −1
Original line number Diff line number Diff line
@@ -101,7 +101,7 @@ const (
	RUNTIME_CTX_ENV = "env"

	// The mode associated with the execution context. It's one of these values:
	//  "run_once", "rpc", "before", "after", "match", "matchmaker", "leaderboard_reset", "tournament_reset", "tournament_end".
	//  "event", "run_once", "rpc", "before", "after", "match", "matchmaker", "leaderboard_reset", "tournament_reset", "tournament_end".
	RUNTIME_CTX_MODE = "execution_mode"

	// Query params that was passed through from HTTP request.
@@ -647,6 +647,12 @@ type Initializer interface {

	// RegisterAfterGetUsers can be used to perform additional logic after retrieving users.
	RegisterAfterGetUsers(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.Users, in *api.GetUsersRequest) error) error

	// RegisterEventSessionStart can be used to define functions triggered when client sessions start.
	RegisterEventSessionStart(fn func(ctx context.Context, logger Logger, evt *api.Event)) error

	// RegisterEventSessionStart can be used to define functions triggered when client sessions end.
	RegisterEventSessionEnd(fn func(ctx context.Context, logger Logger, evt *api.Event)) error
}

type Leaderboard interface {
+14 −0
Original line number Diff line number Diff line
@@ -37,6 +37,12 @@ func InitModule(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runti
	}); err != nil {
		return err
	}
	if err := initializer.RegisterEventSessionStart(eventSessionStart); err != nil {
		return err
	}
	if err := initializer.RegisterEventSessionEnd(eventSessionEnd); err != nil {
		return err
	}
	return nil
}

@@ -129,3 +135,11 @@ func (m *Match) MatchTerminate(ctx context.Context, logger runtime.Logger, db *s

	return state
}

func eventSessionStart(ctx context.Context, logger runtime.Logger, evt *api.Event) {
	logger.Printf("session start %v %v", ctx, evt)
}

func eventSessionEnd(ctx context.Context, logger runtime.Logger, evt *api.Event) {
	logger.Printf("session end %v %v", ctx, evt)
}
+1 −1
Original line number Diff line number Diff line
@@ -177,7 +177,7 @@ func StartApiServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.DB, j
	grpcGatewayRouter := mux.NewRouter()
	// Special case routes. Do NOT enable compression on WebSocket route, it results in "http: response.Write on hijacked connection" errors.
	grpcGatewayRouter.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) }).Methods("GET")
	grpcGatewayRouter.HandleFunc("/ws", NewSocketWsAcceptor(logger, config, sessionRegistry, matchmaker, tracker, jsonpbMarshaler, jsonpbUnmarshaler, pipeline)).Methods("GET")
	grpcGatewayRouter.HandleFunc("/ws", NewSocketWsAcceptor(logger, config, sessionRegistry, matchmaker, tracker, runtime, jsonpbMarshaler, jsonpbUnmarshaler, pipeline)).Methods("GET")

	// Enable stats recording on all request paths except:
	// "/" is not tracked at all.
Loading