// Package deeplink builds and parses the Telegram Mini App "start parameters" that // route a launch to a specific destination. The scheme is shared verbatim with the // UI (ui/src/lib/deeplink.ts): a one-character kind prefix followed by a value — // // g open that game // i open that invitation // f<6-digit code> redeem that friend code // // An empty or unrecognised parameter opens the lobby. UUIDs keep their dashes, // which are allowed in a Telegram startapp parameter ([A-Za-z0-9_-]). package deeplink import "strings" // Kind prefixes for the start-parameter scheme. const ( prefixGame = "g" prefixInvitation = "i" prefixFriendCode = "f" ) // Kind classifies a start parameter. type Kind int // The start-parameter kinds. const ( KindLobby Kind = iota KindGame KindInvitation KindFriendCode ) // Game returns the start parameter that opens the game with the given id. func Game(id string) string { return prefixGame + id } // Invitation returns the start parameter that opens the invitation with the id. func Invitation(id string) string { return prefixInvitation + id } // FriendCode returns the start parameter that redeems the given friend code. func FriendCode(code string) string { return prefixFriendCode + code } // Parse classifies a start parameter and returns its value (the part after the // kind prefix). An empty or unrecognised parameter is KindLobby with an empty // value. func Parse(p string) (Kind, string) { switch { case strings.HasPrefix(p, prefixGame): return KindGame, p[len(prefixGame):] case strings.HasPrefix(p, prefixInvitation): return KindInvitation, p[len(prefixInvitation):] case strings.HasPrefix(p, prefixFriendCode): return KindFriendCode, p[len(prefixFriendCode):] default: return KindLobby, "" } }