155 lines
7.6 KiB
Go
155 lines
7.6 KiB
Go
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
|
||
|
|
}
|
||
|
|
|