render.gno
3.47 Kb ยท 113 lines
1package poker
2
3import (
4 "strings"
5
6 "gno.land/p/demo/poker"
7)
8
9// Render displays the poker realm state as Markdown
10func Render(path string) string {
11 var sb strings.Builder
12
13 if path == "" || path == "/" {
14 renderLobby(&sb)
15 } else if strings.HasPrefix(path, "table/") {
16 tableID := path[6:]
17 renderTable(&sb, tableID)
18 } else {
19 sb.WriteString("# ๐ GnoPoker\n\n")
20 sb.WriteString("Unknown path: " + path + "\n\n")
21 sb.WriteString("[Back to Lobby](/r/demo/poker)\n")
22 }
23
24 return sb.String()
25}
26
27func renderLobby(sb *strings.Builder) {
28 sb.WriteString("# ๐ GnoPoker โ Decentralized Texas Hold'em\n\n")
29 sb.WriteString("Play poker on gno.land blockchain. Provably fair, GNOT-powered.\n\n")
30 sb.WriteString("---\n\n")
31
32 totalPlayers := 0
33 totalPot := int64(0)
34 for _, id := range tableList {
35 t := tables[id]
36 totalPlayers += len(t.Players)
37 totalPot += t.Pot
38 }
39
40 sb.WriteString("## ๐ Platform Stats\n\n")
41 sb.WriteString("| Metric | Value |\n")
42 sb.WriteString("|--------|-------|\n")
43 sb.WriteString("| Tables | " + poker.IntToStr(len(tableList)) + " |\n")
44 sb.WriteString("| Players | " + poker.IntToStr(totalPlayers) + " |\n")
45 sb.WriteString("| Total Pot | " + int64ToStr(totalPot/1_000_000) + " GNOT |\n")
46 sb.WriteString("| Rake | " + int64ToStr(rakePercent/100) + "." + int64ToStr(rakePercent%100) + "% |\n\n")
47
48 sb.WriteString("## ๐ฐ Active Tables\n\n")
49 sb.WriteString("| Name | Players | Blinds | Pot | Status |\n")
50 sb.WriteString("|------|---------|--------|-----|--------|\n")
51
52 for _, id := range tableList {
53 t := tables[id]
54 sb.WriteString("| [" + t.Name + "](/r/demo/poker:table/" + t.ID + ")")
55 sb.WriteString(" | " + poker.IntToStr(len(t.Players)) + "/" + poker.IntToStr(t.MaxPlayers))
56 sb.WriteString(" | " + int64ToStr(t.SmallBlind/1_000_000) + "/" + int64ToStr(t.BigBlind/1_000_000) + " GNOT")
57 sb.WriteString(" | " + int64ToStr(t.Pot/1_000_000) + " GNOT")
58 sb.WriteString(" | " + t.State.String() + " |\n")
59 }
60
61 sb.WriteString("\n---\n\n")
62 sb.WriteString("*Connect your [Adena Wallet](https://adena.app) and join a table!*\n")
63}
64
65func renderTable(sb *strings.Builder, tableID string) {
66 table, ok := tables[tableID]
67 if !ok {
68 sb.WriteString("# โ Table Not Found\n\n")
69 sb.WriteString("Table `" + tableID + "` does not exist.\n\n")
70 sb.WriteString("[Back to Lobby](/r/demo/poker)\n")
71 return
72 }
73
74 sb.WriteString("# ๐ " + table.Name + "\n\n")
75 sb.WriteString("**" + poker.IntToStr(table.MaxPlayers) + "-Max** | ")
76 sb.WriteString("State: **" + table.State.String() + "** | ")
77 sb.WriteString("Pot: **" + int64ToStr(table.Pot/1_000_000) + " GNOT**\n\n")
78
79 sb.WriteString("## ๐ฅ Players\n\n")
80 sb.WriteString("| Seat | Address | Chips | Status |\n")
81 sb.WriteString("|------|---------|-------|--------|\n")
82
83 for i, p := range table.Players {
84 status := "Active"
85 if p.HasFolded {
86 status = "Folded"
87 } else if p.IsAllIn {
88 status = "All-In"
89 }
90 if i == table.CurrentTurn && table.State != poker.StateWaiting {
91 status += " โ"
92 }
93
94 addr := p.Address
95 shortAddr := addr[:8] + "..." + addr[len(addr)-4:]
96
97 sb.WriteString("| " + poker.IntToStr(i+1))
98 sb.WriteString(" | " + shortAddr)
99 sb.WriteString(" | " + int64ToStr(p.Chips/1_000_000) + " GNOT")
100 sb.WriteString(" | " + status + " |\n")
101 }
102
103 if len(table.Community) > 0 {
104 sb.WriteString("\n## ๐ Community Cards\n\n")
105 for _, c := range table.Community {
106 sb.WriteString(poker.CardString(c) + " ")
107 }
108 sb.WriteString("\n")
109 }
110
111 sb.WriteString("\n---\n\n")
112 sb.WriteString("[โ Back to Lobby](/r/demo/poker)\n")
113}