Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}