package routers import ( "context" "sync" ) var _ = sync.Mutex{} var _ = context.Background // // 眼界 (Tuite) — the phone's short-video / Twitter-like app. // Why this file exists: the panel opens but every list is empty, because all of them are filters // over one server-owned list and nothing ever filled it. SocialNetWorkUtils.lua reads // gPlayerManager.infoMinor.bindData.playerTuiteInfo.TuiteList from six places — // GetRecommendList:143, GetExploreTuiteList:400, GetFollowList:431, GetTuiteListByPubisher:445, // GetCollectionList:1687, GetLocalTuiteList:3046 — and GetTuiteInfo(v) then resolves the // body with LTConfig.TuiteConfig.GetConfig(v.CfgId). The list itself is published in the // login frame (see RuntimePayloadFactory), so the app is populated on entry; what is left is the // interaction half, which is one INVOKE per gesture. // The server only names the post instance. Text, images, area and author all come from // tables the client already has (TuiteConfig 204 rows / TuiteCommentConfig 1031 rows / // TuiteNPCConfig 562 rows) — see TuiteCatalog4229938. // ⛑ Return framing is taken from the client's own reader, never guessed: // 63653286 AskTuiteGetDetail -> struct Reader[348] // 63950672 AskTuiteGetDetailByConfigId -> struct Reader[348] // 63989368 AskInteractTuite -> struct Reader[348] // 63477523 AskTuiteGetCommentList -> struct Reader[620] // 63242664 AskTuiteLikeComment -> struct Reader[605] // 63264230 AskTuiteGetTimelineData -> complex Reader[608] (0xFF + u32 + string) // 63241162 / 63029158 / 63801315 -> void // A wrong shape does not throw — it desynchronises the client's reader of the reply and silently // drops the callback, so each handler below returns exactly the shape above even when empty. // ⛑ HasTimeline is never set: the blob PlayMultiVideo wants is one the client // authors and uploads (AskTuiteUpdateTimelineInfo, 102400-byte limit), so there is no server-side // copy of the five video posts' data. Marking them true would make the client request a blob we // cannot serve; leaving it false costs only the video. // // // Projects a catalogue post into the wire row. Shared by the detail handlers so the numbers on // a detail page always match the row it was opened from. // func GameRouter_Tuite_BuildTuiteInfo(ctx context.Context, post any, session *GameSession) any { // Router implementation for GameRouter_Tuite_BuildTuiteInfo var zero any; return zero } func GameRouter_Tuite_BuildTuiteComment(ctx context.Context, comment any, index int64) any { // Router implementation for GameRouter_Tuite_BuildTuiteComment var zero any; return zero } // Reads the leading u32 of a request body (every Tuite request starts with an id). func GameRouter_Tuite_TuiteRequestId(ctx context.Context, msg any) uint32 { // Router implementation for GameRouter_Tuite_TuiteRequestId return 0 } // ================================================================================= // Detail — what tapping a row opens // // GetSocialNetworkDetail (SocialNetWorkUtils.lua:637) picks the request by whether the id is a // config row: `if tuiteCfg then` -> AskTuiteGetDetailByConfigId, else AskTuiteGetDetail. Every // id we publish is a TuiteConfig row, so in practice only the ByConfigId variant fires — the // other one is implemented anyway because a player-published post takes that path. // ================================================================================= func GameRouter_Tuite_AskTuiteGetDetailByConfigId(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Tuite_AskTuiteGetDetailByConfigId var zero any; return zero } func GameRouter_Tuite_AskTuiteGetDetail(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Tuite_AskTuiteGetDetail var zero any; return zero } func GameRouter_Tuite_ReturnTuiteDetailAsync(ctx context.Context, conn any, msg any, via string) any { // Router implementation for GameRouter_Tuite_ReturnTuiteDetailAsync var zero any; return zero } // // AskInteractTuite(63989368) — (uint tuiteId, TuiteState interactType), 5 bytes. // Like (8) and Favorite (16) are the two the panels actually send // (SocialNetWorkUtils.lua:498 / :552). The reply is the updated row, and the client also edits // its own copy in place (GetSeverTuiteInfoById), so the session set is what keeps the // flag across a re-opened panel. // func GameRouter_Tuite_AskInteractTuite(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Tuite_AskInteractTuite var zero any; return zero } // // AskTuiteFollowRole(63241162) — (uint roleId), void return. // The client marks the whole author's list itself on success // (SocialNetWorkUtils.lua:610-625), so the server only has to answer; the set is kept anyway so // a later detail request agrees with the local flag. // func GameRouter_Tuite_AskTuiteFollowRole(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Tuite_AskTuiteFollowRole var zero any; return zero } // AskReportTuiteDetailOpened(63029158) — (uint tuiteId), void. Fired by YanjieNewDetailPagePanel.lua:165. func GameRouter_Tuite_AskReportTuiteDetailOpened(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Tuite_AskReportTuiteDetailOpened var zero any; return zero } // // AskTuiteTakeReward(63801315) — (uint tuiteId), void. // Only reachable when a row carries a non-zero DropId, which catalogue posts never do // (the 领取 button is hidden without it), so this is a safety net for a hand-edited catalogue. // func GameRouter_Tuite_AskTuiteTakeReward(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Tuite_AskTuiteTakeReward var zero any; return zero } // ================================================================================= // Comments // // The list page's comment count comes from the client (GetYanjieCommentCount falls back to // #TuiteConfig.Comment), so this handler is what fills the comment section itself. Author // identity is the only thing the server owns down here — the text is TuiteCommentConfig's. // ================================================================================= // AskTuiteGetCommentList(63477523) — (uint tuiteId, int page, int pageSize), 12 bytes. func GameRouter_Tuite_AskTuiteGetCommentList(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Tuite_AskTuiteGetCommentList var zero any; return zero } // // AskTuiteLikeComment(63242664) — (uint tuiteId, uint commentId, bool isLike), struct Reader[605]. // Per-session only; there is no counter to move because TuiteCommentConfig carries no likes. // func GameRouter_Tuite_AskTuiteLikeComment(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Tuite_AskTuiteLikeComment var zero any; return zero } // ================================================================================= // Timeline — deliberately empty // // AskTuiteGetTimelineData(63264230) -> complex Reader[608] { uint Id, string TimelineData }. // Reachable only when a row is published with HasTimeline, which never happens (see the header), // so the honest answer is an empty blob rather than an invented one — an empty string makes // PlayMultiVideo a no-op instead of feeding it fabricated data. // ================================================================================= func GameRouter_Tuite_AskTuiteGetTimelineData(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_Tuite_AskTuiteGetTimelineData var zero any; return zero }