@vatvaghool/create-ipl-dashboard 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +75 -0
  2. package/package.json +27 -0
  3. package/src/generate-template.mjs +73 -0
  4. package/src/index.mjs +98 -0
  5. package/src/prompts.mjs +78 -0
  6. package/src/scaffold.mjs +129 -0
  7. package/src/scraper.mjs +79 -0
  8. package/template/.dockerignore +13 -0
  9. package/template/AGENTS.md +5 -0
  10. package/template/Dockerfile.sync +14 -0
  11. package/template/README.md +160 -0
  12. package/template/app/api/ipl/data.ts +24 -0
  13. package/template/app/api/ipl/route.ts +505 -0
  14. package/template/app/api/ipl/transfers/route.ts +261 -0
  15. package/template/app/api/ipl/transfers/transform.ts +156 -0
  16. package/template/app/api/ipl/transform.ts +20 -0
  17. package/template/app/api/ipl/upcoming-matches/route.ts +18 -0
  18. package/template/app/api/ops/status/route.ts +225 -0
  19. package/template/app/components/AIRoasting.tsx +278 -0
  20. package/template/app/components/ColorWave.tsx +193 -0
  21. package/template/app/components/CrownBattle.tsx +207 -0
  22. package/template/app/components/DashboardContent.tsx +377 -0
  23. package/template/app/components/FantasyStockTicker.tsx +192 -0
  24. package/template/app/components/FireworksBurst.tsx +225 -0
  25. package/template/app/components/LiveMatchTicker.tsx +117 -0
  26. package/template/app/components/MatchRecapScroll.tsx +135 -0
  27. package/template/app/components/MatchStoryScrubber.tsx +274 -0
  28. package/template/app/components/PerformanceTracker.tsx +132 -0
  29. package/template/app/components/ProgressGlowRings.tsx +157 -0
  30. package/template/app/components/TeamDNAScanner.tsx +238 -0
  31. package/template/app/components/ThemeToggle.tsx +74 -0
  32. package/template/app/components/dashboard/CaptainBoard.tsx +138 -0
  33. package/template/app/components/dashboard/ChartBoard.tsx +162 -0
  34. package/template/app/components/dashboard/LatestBadge.tsx +23 -0
  35. package/template/app/components/dashboard/LedgerTable.tsx +385 -0
  36. package/template/app/components/dashboard/SectionCard.tsx +59 -0
  37. package/template/app/components/dashboard/StickyMini.tsx +20 -0
  38. package/template/app/components/dashboard/index.ts +6 -0
  39. package/template/app/components/ui/DashboardChartFrame.tsx +74 -0
  40. package/template/app/components/ui/DoodleSpinner.tsx +15 -0
  41. package/template/app/components/ui/TeamPills.tsx +41 -0
  42. package/template/app/data/match-points.ts +3 -0
  43. package/template/app/data/teams.ts +32 -0
  44. package/template/app/globals.css +1267 -0
  45. package/template/app/hooks/dashboard/index.ts +1 -0
  46. package/template/app/hooks/dashboard/useDashboardModel.ts +25 -0
  47. package/template/app/hooks/dashboardCache.ts +53 -0
  48. package/template/app/hooks/dashboardPolling.ts +53 -0
  49. package/template/app/hooks/snapshotCache.ts +47 -0
  50. package/template/app/hooks/useDashboardData.ts +28 -0
  51. package/template/app/layout.tsx +75 -0
  52. package/template/app/lib/aiAgent.ts +444 -0
  53. package/template/app/lib/config.ts +29 -0
  54. package/template/app/lib/dashboard/index.ts +1 -0
  55. package/template/app/lib/dashboard/model.ts +257 -0
  56. package/template/app/lib/dashboardData.ts +50 -0
  57. package/template/app/lib/dashboardView.ts +22 -0
  58. package/template/app/lib/detailedData.ts +112 -0
  59. package/template/app/lib/matchStatus.ts +28 -0
  60. package/template/app/lib/matches.ts +131 -0
  61. package/template/app/lib/teamBadges.ts +223 -0
  62. package/template/app/lib/upcomingMatches.ts +154 -0
  63. package/template/app/lib/useDb.ts +29 -0
  64. package/template/app/lib/utils/diff.ts +24 -0
  65. package/template/app/lib/utils/getChartColor.ts +17 -0
  66. package/template/app/lib/utils/getStdDeviation.ts +6 -0
  67. package/template/app/lib/utils/time.ts +40 -0
  68. package/template/app/lib/utils.ts +70 -0
  69. package/template/app/page.tsx +15 -0
  70. package/template/app/store/dashboardStore.ts +85 -0
  71. package/template/app/types/dashboard.ts +75 -0
  72. package/template/app/types.ts +130 -0
  73. package/template/app/utils/dashboard/index.ts +72 -0
  74. package/template/eslint.config.mjs +18 -0
  75. package/template/infra/cloud-run/README.md +68 -0
  76. package/template/infra/cloud-run/sync-job.yaml +32 -0
  77. package/template/infra/cutover/README.md +84 -0
  78. package/template/infra/vercel/README.md +57 -0
  79. package/template/next.config.ts +7 -0
  80. package/template/package-lock.json +7330 -0
  81. package/template/package.json +47 -0
  82. package/template/packages/ipl-dashboard-utils/README.md +316 -0
  83. package/template/packages/ipl-dashboard-utils/package.json +34 -0
  84. package/template/packages/ipl-dashboard-utils/src/index.ts +22 -0
  85. package/template/packages/ipl-dashboard-utils/src/transform.ts +687 -0
  86. package/template/packages/ipl-dashboard-utils/src/types.ts +88 -0
  87. package/template/packages/ipl-dashboard-utils/tsconfig.build.json +17 -0
  88. package/template/postcss.config.mjs +7 -0
  89. package/template/scripts/capture-ipl-auth.mjs +54 -0
  90. package/template/scripts/deploy-cloud-run-sync.sh +48 -0
  91. package/template/scripts/deploy-cloud-scheduler.sh +42 -0
  92. package/template/scripts/dev-simple.js +31 -0
  93. package/template/scripts/dev-welcome.mjs +38 -0
  94. package/template/scripts/monitor-ops-status.sh +50 -0
  95. package/template/scripts/seed-mongodb.ts +115 -0
  96. package/template/scripts/sync-cloud.mjs +50 -0
  97. package/template/scripts/sync-ipl.mjs +238 -0
  98. package/template/scripts/sync-transfers-daily.mjs +175 -0
  99. package/template/scripts/verify-production.mjs +108 -0
  100. package/template/tests/coverage-gaps.test.ts +290 -0
  101. package/template/tests/dashboard-polling.test.ts +96 -0
  102. package/template/tests/detailed-data.test.ts +60 -0
  103. package/template/tests/ipl-transform.test.ts +590 -0
  104. package/template/tests/transfers-route.test.ts +109 -0
  105. package/template/tests/upcoming-matches.test.ts +34 -0
  106. package/template/tests/utils-and-cache.test.ts +267 -0
  107. package/template/tsconfig.json +35 -0
  108. package/template/vercel.json +7 -0
@@ -0,0 +1,444 @@
1
+ export const LANGUAGES = ["en", "hi", "mr", "te"] as const;
2
+ export type Lang = (typeof LANGUAGES)[number];
3
+
4
+ const pick = <T>(arr: T[]): T => arr[Math.floor(Math.random() * arr.length)];
5
+
6
+ const praiseLines: Record<Lang, string[]> = {
7
+ en: [
8
+ "{team} just cooked with {pts} pts. Gordon Ramsay would be proud.",
9
+ "{team} dropped {pts}. Opponents currently filing complaints.",
10
+ "{pts} pts?? {team} woke up and chose violence.",
11
+ "{team} absolutely demolished with {pts} points. Pure class.",
12
+ "{team} showed up and showed OUT with {pts} points.",
13
+ "{team} turned it UP with {pts} points. No mercy mode activated.",
14
+ "{pts} points?? {team} said \"let's make it interesting\".",
15
+ "{team} blessed us with {pts} points. A true masterclass.",
16
+ "{team} hit different today with {pts}. The real deal.",
17
+ ],
18
+ hi: [
19
+ "{team} ने {pts} अंकों से धूम मचा दी। शानदार प्रदर्शन!",
20
+ "{team} ने {pts} पॉइंट्स से सबको चौंका दिया। जबरदस्त खेल!",
21
+ "{pts} अंक?? {team} ने तो कमाल कर दिया।",
22
+ "{team} ने {pts} पॉइंट्स के साथ बाज़ी मार ली।",
23
+ "{team} ने दिखा दिया कि असली खिलाड़ी कैसे खेलते हैं - {pts} अंक।",
24
+ "{team} आज बेमिसाल था। {pts} अंक, बस कमाल!",
25
+ "{team} ने {pts} पॉइंट्स बनाकर सबको चुप करा दिया।",
26
+ "{team} का प्रदर्शन {pts} अंकों के साथ अविस्मरणीय रहा।",
27
+ "{pts} पॉइंट्स? {team} ने आज कोई रहम नहीं दिखाया!",
28
+ ],
29
+ mr: [
30
+ "{team} ने {pts} गुणांनी धमाल केलं. अप्रतिम कामगिरी!",
31
+ "{team} ने {pts} पॉइंट्स मारून प्रतिस्पर्ध्यांना धूळ चारली.",
32
+ "{pts} गुण?? {team} ने आजंगला काढली. अजबब!",
33
+ "{team} चा {pts} पॉइंट्सचा खेळ बघून सगळे हैराण.",
34
+ "{team} ने {pts} पॉइंट्स स्कोअर करून दाखवून दिलं की ते किती ताकदवान आहेत.",
35
+ "{team} आज फॉर्ममध्ये होतं. {pts} गुण म्हणजे सुपर!",
36
+ "{team} च्या {pts} पॉइंट्सनी सगळ्यांचं मन जिंकलं.",
37
+ "{team} ने {pts} गुण कमावून आपली स्टार क्वॉलिटी सिद्ध केली.",
38
+ "{pts} पॉइंट्स? {team} ने आज कोणालाही सोडलं नाही!",
39
+ ],
40
+ te: [
41
+ "{team} {pts} పాయింట్లతో హల్ చేసేసింది. అద్భుతం!",
42
+ "{team} {pts} పాయింట్లు సాధించి అందరినీ ఆశ్చర్యపరిచింది.",
43
+ "{pts} పాయింట్లా? {team} చెలరేగిపోయింది.",
44
+ "{team} {pts} పాయింట్లతో ఆధిపత్యం చెలాయించింది.",
45
+ "{team} నిజమైన ఛాంపియన్ లా ఆడింది - {pts} పాయింట్లు.",
46
+ "{team} ఈరోజు {pts} పాయింట్లతో అదరగొట్టింది.",
47
+ "{team} {pts} పాయింట్లు స్కోర్ చేసి అందరిని నివ్వెర పోయేలా చేసింది.",
48
+ "{team} ప్రదర్శన {pts} పాయింట్లతో మరపురానిది.",
49
+ "{pts} పాయింట్లా? {team} ఎవరినీ విడిచిపెట్టలేదు!",
50
+ ],
51
+ };
52
+
53
+ const roastLines: Record<Lang, string[]> = {
54
+ en: [
55
+ "{team} scored {pts}. I've seen loading screens perform better.",
56
+ "{team} with {pts} pts… was this a strategy or an accident?",
57
+ "{pts} pts by {team}. Bold of you to call that a performance.",
58
+ "{team} really said \"minimum effort, maximum embarrassment\".",
59
+ "{team}: {pts} pts and a prayer.",
60
+ "{pts}? {team}, that's not even trying.",
61
+ "{team} showed up with {pts} points. To disappoint, that is.",
62
+ "{pts} pts?? {team} said \"let's keep it bad\".",
63
+ "{team} managed {pts}. Even their effort needs effort.",
64
+ "{pts} pts from {team}. A performance we'll all try to forget.",
65
+ "{team} delivered {pts}... delivered us straight to disappointment.",
66
+ ],
67
+ hi: [
68
+ "{team} ने {pts} अंक बनाए। लोडिंग स्क्रीन भी इससे बेहतर परफॉर्म करती है।",
69
+ "{team} के {pts} अंक… ये रणनीति थी या कोई मज़ाक?",
70
+ "{pts} अंक? {team}, क्या ये प्रदर्शन बोलते हैं?",
71
+ "{team} ने कहा \"कम से कम मेहनत, ज़्यादा से ज़्यादा शर्मिंदगी\"।",
72
+ "{team}: {pts} अंक और एक दुआ।",
73
+ "{pts}? {team}, ये तो कोशिश भी नहीं है।",
74
+ "{team} ने {pts} अंकों से निराश किया।",
75
+ "{pts} अंक?? {team} ने लगातार खराब रहने का फैसला किया।",
76
+ "{team} ने {pts} बनाए। इनकी मेहनत को भी मेहनत चाहिए।",
77
+ "{team} के {pts} अंक - एक प्रदर्शन जो हम भूलना चाहेंगे।",
78
+ "{team} ने {pts} दिए... निराशा के अलावा कुछ नहीं।",
79
+ ],
80
+ mr: [
81
+ "{team} ने {pts} गुण मिळवले. लोडिंग स्क्रीन पण यापेक्षा चांगली परफॉर्म करते.",
82
+ "{team} चे {pts} गुण… ही रणनीती होती की विनोद?",
83
+ "{pts} गुण? {team}, खरेच हे तुमचं सर्वोत्तम?",
84
+ "{team} म्हणालं \"कमीत कमी मेहनत, जास्तीत जास्त बेअब्रू\".",
85
+ "{team}: {pts} गुण आणि एक प्रार्थना.",
86
+ "{pts}? {team}, हा प्रयत्नही नाही.",
87
+ "{team} ने {pts} गुणांनी निराश केलं.",
88
+ "{pts} गुण?? {team} ने सातत्याने वाईट राहण्याचा निर्णय घेतला.",
89
+ "{team} ने {pts} मिळवले. त्यांच्या मेहनतीलाही मेहनत हवी.",
90
+ "{team} चे {pts} गुण - एक कामगिरी जी आपण विसरू इच्छितो.",
91
+ "{team} ने {pts} दिले... निराशेशिवाय काहीच नाही.",
92
+ ],
93
+ te: [
94
+ "{team} {pts} పాయింట్లు సాధించింది. లోడింగ్ స్క్రీన్ కూడా బెటర్ పెర్ఫార్మ్ చేస్తుంది.",
95
+ "{team} {pts} పాయింట్లా… ఇది వ్యూహమా లేక ప్రమాదమా?",
96
+ "{pts} పాయింట్లు? {team}, ఇదేనా మీ ప్రదర్శన?",
97
+ "{team} చెప్పింది \"తక్కువ ప్రయత్నం, ఎక్కువ అవమానం\".",
98
+ "{team}: {pts} పాయింట్లు మరియు ఒక ప్రార్థన.",
99
+ "{pts}? {team}, ఇది ప్రయత్నం కూడా కాదు.",
100
+ "{team} {pts} పాయింట్లతో నిరాశ పరిచింది.",
101
+ "{pts} పాయింట్లా?? {team} \"స్థిరంగా చెడుగా\" ఉండాలని నిర్ణయించుకుంది.",
102
+ "{team} {pts} సాధించింది. వీరి ప్రయత్నానికి కూడా ప్రయత్నం కావాలి.",
103
+ "{team} {pts} పాయింట్లు - మర్చిపోదగిన ప్రదర్శన.",
104
+ "{team} {pts} ఇచ్చింది... నిరాశ తప్ప మరేమీ లేదు.",
105
+ ],
106
+ };
107
+
108
+ const consistencyLines: Record<Lang, string[]> = {
109
+ en: [
110
+ "{team} is so consistent (vol: {vol}). No drama, no surprises.",
111
+ "{team} shows up every match like clockwork.",
112
+ "{team} proves consistency beats flashiness (vol: {vol}).",
113
+ "{team} is the definition of reliable—steady as a rock with vol {vol}.",
114
+ "{team} doesn't gamble. Every match is calculated.",
115
+ "That {vol} volatility? {team} said \"boring is beautiful\".",
116
+ "{team} has mastered showing up the same way every time.",
117
+ "Boring? Maybe. But {team}'s consistency (vol: {vol}) is elite.",
118
+ "{team} decided consistency is the best policy.",
119
+ "{team} doesn't do rollercoasters—just smooth sailing (vol: {vol}).",
120
+ ],
121
+ hi: [
122
+ "{team} इतना स्थिर है (vol: {vol})। कोई ड्रामा नहीं, कोई सरप्राइज़ नहीं।",
123
+ "{team} हर मैच में घड़ी की तरह आता है।",
124
+ "{team} साबित करता है कि स्थिरता चमक से बेहतर है (vol: {vol})।",
125
+ "{team} भरोसेमंदी की मिसाल है—{vol} vol के साथ बिल्कुल स्थिर।",
126
+ "{team} जुआ नहीं खेलता। हर मैच गणना पर आधारित है।",
127
+ "{vol} वोलैटिलिटी? {team} ने कहा \"बोरिंग भी खूबसूरत है\"।",
128
+ "{team} ने हर बार एक जैसा प्रदर्शन करने की कला सीख ली है।",
129
+ "बोरिंग? शायद। लेकिन {team} की स्थिरता (vol: {vol}) टॉप क्लास है।",
130
+ "{team} ने तय किया कि स्थिरता ही सबसे अच्छी नीति है।",
131
+ "{team} रोलरकोस्टर नहीं खेलता—बस शांत नौकायन (vol: {vol})।",
132
+ ],
133
+ mr: [
134
+ "{team} इतके सातत्यपूर्ण आहे (vol: {vol}). ना नाटक, ना आश्चर्य.",
135
+ "{team} प्रत्येक सामन्यात घड्याळ्यासारखं खेळतो.",
136
+ "{team} सिद्ध करतं की सातत्य चमकपेक्षा महत्त्वाचं आहे (vol: {vol}).",
137
+ "{team} विश्वासार्हतेचं उदाहरण आहे—{vol} vol सह स्थिर.",
138
+ "{team} जुगार खेळत नाही. प्रत्येक सामना गणनेवर आधारित.",
139
+ "{vol} व्होलॅटिलिटी? {team} म्हणालं \"कंटाळवाणं पण सुंदर\".",
140
+ "{team} ने प्रत्येक वेळी सारखंच खेळण्याची कला आत्मसात केली आहे.",
141
+ "कंटाळवाणं? कदाचित. पण {team} चं सातत्य (vol: {vol}) उत्तम दर्जाचं आहे.",
142
+ "{team} ने ठरवलं की सातत्य हेच सर्वोत्तम धोरण आहे.",
143
+ "{team} रोलरकोस्टर खेळत नाही—फक्त शांतपणे पुढे जातं (vol: {vol}).",
144
+ ],
145
+ te: [
146
+ "{team} చాలా స్థిరంగా ఉంది (vol: {vol}). డ్రామా లేదు, ఆశ్చర్యం లేదు.",
147
+ "{team} ప్రతి మ్యాచ్ లో గడియారం లా ఆడుతుంది.",
148
+ "{team} నిరూపిస్తుంది - స్థిరత్వం మెరుపు కంటే గొప్పది (vol: {vol}).",
149
+ "{team} నమ్మకానికి నిలువెత్తు నిదర్శనం—{vol} vol తో స్థిరంగా.",
150
+ "{team} జూదం ఆడదు. ప్రతి మ్యాచ్ లెక్కబద్ధంగా ఉంటుంది.",
151
+ "{vol} అస్థిరతా? {team} చెప్పింది \"బోరింగ్ కూడా అందమే\".",
152
+ "{team} ప్రతిసారీ ఒకేలా ఆడటంలో మాస్టర్ అయ్యింది.",
153
+ "బోరింగ్? అనుకోండి. కానీ {team} స్థిరత్వం (vol: {vol}) అద్భుతం.",
154
+ "{team} నిర్ణయించుకుంది - స్థిరత్వమే అత్యుత్తమ వ్యూహం.",
155
+ "{team} రోలర్ కోస్టర్ కాదు—కేవలం స్మూత్ సెయిలింగ్ (vol: {vol}).",
156
+ ],
157
+ };
158
+
159
+ const leaderLines: Record<Lang, string[]> = {
160
+ en: [
161
+ "{team} dominating at {avg} pts/match. Simply built different.",
162
+ "{team} is the season's true backbone—averaging {avg} per match.",
163
+ "{team} said \"I'll be #1\" and delivered. {avg} pts avg proves it.",
164
+ "{avg} pts per match?? {team} is the undisputed king.",
165
+ "{team} doesn't just lead—they inspire. {avg} avg is the proof.",
166
+ "The bar is {team}-high. {avg} pts per match sets the standard.",
167
+ "{team} is rewriting the rulebook. {avg} pts/match is legendary.",
168
+ "Other teams play checkers. {team} plays chess at {avg} pts/match.",
169
+ "{team} averaged {avg} pts? That's leaving everyone behind.",
170
+ "{team}'s {avg} pts/match average is a mic drop for the season.",
171
+ ],
172
+ hi: [
173
+ "{team} का दबदबा है {avg} pts/मैच के साथ। बस अलग लेवल।",
174
+ "{team} इस सीज़न की असली रीढ़ है—{avg} प्रति मैच औसत।",
175
+ "{team} ने कहा \"मैं #1 रहूंगा\" और कर दिखाया। {avg} औसत सबूत है।",
176
+ "{avg} अंक प्रति मैच?? {team} निर्विवाद राजा है।",
177
+ "{team} सिर्फ नेतृत्व नहीं करता—प्रेरित करता है। {avg} औसत इसका सबूत।",
178
+ "बार {team} जितना ऊंचा है। {avg} अंक/मैच मानक स्थापित करता है।",
179
+ "{team} नियमों को फिर से लिख रहा है। {avg} pts/मैच महानता है।",
180
+ "दूसरी टीमें चेकर खेलती हैं। {team} {avg} pts/मैच से शतरंज खेलता है।",
181
+ "{team} ने {avg} अंक औसत निकाला? सबको पीछे छोड़ दिया।",
182
+ "{team} का {avg} अंक/मैच का औसत सीज़न का सबसे बड़ा बयान है।",
183
+ ],
184
+ mr: [
185
+ "{team} चं वर्चस्व आहे {avg} गुण/सामना. वेगळंच लेवल.",
186
+ "{team} या सीझनचा खरा कणा आहे—{avg} प्रति सामना सरासरी.",
187
+ "{team} म्हणालं \"मी #1 राहीन\" आणि दाखवून दिलं. {avg} सरासरी पुरावा आहे.",
188
+ "{avg} गुण प्रति सामना?? {team} निर्विवाद राजा आहे.",
189
+ "{team} फक्त नेतृत्व करत नाही—प्रेरित करतं. {avg} सरासरी याचा पुरावा.",
190
+ "बार {team} एवढा उंच आहे. {avg} गुण/सामना मानक स्थापित करतं.",
191
+ "{team} नियम पुन्हा लिहित आहे. {avg} गुण/सामना म्हणजे महानता.",
192
+ "इतर संघ चेकर खेळतात. {team} {avg} गुण/सामना शतरंज खेळतं.",
193
+ "{team} ने {avg} गुण सरासरी काढली? सगळ्यांना मागे टाकलं.",
194
+ "{team} चं {avg} गुण/सामना सरासरी ही सीझनची सगळ्यात मोठी घोषणा आहे.",
195
+ ],
196
+ te: [
197
+ "{team} {avg} పాయింట్ల/మ్యాచ్ తో ఆధిపత్యం. వేరే లెవల్.",
198
+ "{team} ఈ సీజన్ కి వెన్నెముక—{avg} సగటు ప్రతి మ్యాచ్ కి.",
199
+ "{team} చెప్పింది \"నేను #1 ఉంటాను\" మరియు నిరూపించింది. {avg} సగటు రుజువు.",
200
+ "{avg} పాయింట్లు ప్రతి మ్యాచ్ కి?? {team} వివాదాస్పద రాజు.",
201
+ "{team} కేవలం నాయకత్వం వహించదు—ప్రేరేపిస్తుంది. {avg} సగటు నిదర్శనం.",
202
+ "బార్ {team} ఎత్తులో ఉంది. {avg} పాయింట్లు/మ్యాచ్ ప్రమాణం.",
203
+ "{team} నియమాలను తిరగరాస్తోంది. {avg} pts/మ్యాచ్ లెజెండరీ.",
204
+ "ఇతర జట్లు చెకర్స్ ఆడతాయి. {team} {avg} pts/మ్యాచ్ తో చదరంగం ఆడుతుంది.",
205
+ "{team} {avg} సగటు సాధించింది? అందరినీ వెనక్కి నెట్టేసింది.",
206
+ "{team} {avg} సగటు ఈ సీజన్ లో అతిపెద్ద ప్రకటన.",
207
+ ],
208
+ };
209
+
210
+ const surgeLines: Record<Lang, string[]> = {
211
+ en: [
212
+ "{team} exploded with +{delta} in {day}. What a moment!",
213
+ "{team} reminded everyone +{delta} swing in {day}. The comeback is real.",
214
+ "From zero to hero: {team} +{delta} in {day}.",
215
+ "{team} just turned up the volume with +{delta} in {day}. Madness!",
216
+ "+{delta} points in {day}?? {team} made a statement.",
217
+ "{team} went from sleeping to AWAKE in {day} with +{delta}.",
218
+ "{team} flipped the script with +{delta} in {day}. Momentum!",
219
+ "{team} proved they belong with a massive +{delta} jump in {day}.",
220
+ "+{delta} in a single match by {team}?? Pure fire in {day}.",
221
+ "{team} turned up the gas: +{delta} in {day}. Unstoppable.",
222
+ ],
223
+ hi: [
224
+ "{team} ने {day} में +{delta} से धमाल मचा दिया। क्या पल है!",
225
+ "{team} ने {day} में +{delta} के उछाल से सबको याद दिलाया। वापसी असली है।",
226
+ "ज़ीरो से हीरो: {day} में {team} +{delta}।",
227
+ "{team} ने {day} में +{delta} से वॉल्यूम बढ़ा दिया। पागलपन!",
228
+ "{day} में +{delta} अंक?? {team} ने बयान दिया है।",
229
+ "{team} {day} में +{delta} के साथ सोते से जाग गया।",
230
+ "{team} ने {day} में +{delta} के साथ स्क्रिप्ट पलट दी।",
231
+ "{team} ने {day} में +{delta} के साथ दिखा दिया। आग है ये!",
232
+ "{day} में {team} का +{delta} ? शुद्ध आग।",
233
+ "{team} ने गियर बदला: {day} में +{delta}। अजेय।",
234
+ ],
235
+ mr: [
236
+ "{team} ने {day} मध्ये +{delta} ने धमाल केलं. काय क्षण आहे!",
237
+ "{team} ने {day} मध्ये +{delta} उसळीने सगळ्यांना आठवण करून दिली. वापसी खरी आहे.",
238
+ "शून्य ते हिरो: {day} मध्ये {team} +{delta}.",
239
+ "{team} ने {day} मध्ये +{delta} ने व्हॉल्यूम वाढवला. वेडेपणा!",
240
+ "{day} मध्ये +{delta} गुण?? {team} ने विधान केलं आहे.",
241
+ "{team} {day} मध्ये +{delta} सह झोपेतून जागं झालं.",
242
+ "{team} ने {day} मध्ये +{delta} सह स्क्रिप्ट पलटली.",
243
+ "{team} ने {day} मध्ये +{delta} सह दाखवून दिलं. ही आग आहे!",
244
+ "{day} मध्ये {team} चा +{delta} ? शुद्ध आग.",
245
+ "{team} ने गियर बदलला: {day} मध्ये +{delta}. अजिंक्य.",
246
+ ],
247
+ te: [
248
+ "{team} {day} లో +{delta} తో పేలింది. ఏమి క్షణం!",
249
+ "{team} {day} లో +{delta} స్వింగ్ తో అందరికీ గుర్తు చేసింది. కంబ్యాక్ రియల్.",
250
+ "సున్నా నుండి హీరో: {day} లో {team} +{delta}.",
251
+ "{team} {day} లో +{delta} తో వాల్యూమ్ పెంచింది. వెర్రి!",
252
+ "{day} లో +{delta} పాయింట్లా?? {team} స్టేట్మెంట్ ఇచ్చింది.",
253
+ "{team} {day} లో +{delta} తో నిద్ర నుండి మేల్కొంది.",
254
+ "{team} {day} లో +{delta} తో స్క్రిప్ట్ ఫ్లిప్ చేసింది.",
255
+ "{team} {day} లో +{delta} తో నిరూపించింది. ప్యూర్ ఫైర్!",
256
+ "{team} గేర్ మార్చింది: {day} లో +{delta}. అజేయం.",
257
+ ],
258
+ };
259
+
260
+ const collapseLines: Record<Lang, string[]> = {
261
+ en: [
262
+ "{team} took a {delta}-point nosedive. Gravity working overtime.",
263
+ "{team} went from hero to zero with a {delta} drop. Ouch.",
264
+ "That {delta}-point collapse by {team}? Never forget.",
265
+ "{team} said \"let's tank this\" and succeeded—{delta} pts down.",
266
+ "{team} free-fell {delta} points. Someone check on them.",
267
+ "The wheels fell off for {team}: {delta} points down the drain.",
268
+ "{team} just experienced a spectacular {delta}-point disaster.",
269
+ "{team} dropped {delta} like it's hot. But it's NOT.",
270
+ "{team}'s {delta}-point crash is legendary for all the wrong reasons.",
271
+ "{delta} points?? {team} didn't just drop—they PLUMMETED.",
272
+ ],
273
+ hi: [
274
+ "{team} ने {delta} अंकों की गिरावट दर्ज की। गुरुत्वाकर्षण ओवरटाइम काम कर रहा है।",
275
+ "{team} हीरो से ज़ीरो हो गया—{delta} अंकों की गिरावट।",
276
+ "{team} का {delta} अंकों का पतन? कभी मत भूलना।",
277
+ "{team} ने \"टैंक करो\" कहा और सफल हुए—{delta} अंक नीचे।",
278
+ "{team} {delta} अंक गिर गया। कोई उन्हें संभाले।",
279
+ "{team} के पहिए उतर गए: {delta} अंक बर्बाद।",
280
+ "{team} ने एक शानदार {delta}-अंकीय आपदा का अनुभव किया।",
281
+ "{team} ने {delta} अंक गिराए जैसे गर्म है। लेकिन गर्म नहीं है।",
282
+ "{team} का {delta}-अंकीय क्रैश गलत कारणों से प्रसिद्ध है।",
283
+ "{delta} अंक?? {team} सिर्फ गिरा नहीं—गोता लगाया।",
284
+ ],
285
+ mr: [
286
+ "{team} ने {delta} गुणांची घसरण नोंदवली. गुरुत्वाकर्षण ओव्हरटाइम काम करत आहे.",
287
+ "{team} हिरो तून झिरो झालं—{delta} गुणांची घसरण.",
288
+ "{team} चं {delta} गुणांचं पतन? कधीही विसरू नका.",
289
+ "{team} म्हणालं \"टँक करूया\" आणि यशस्वी झालं—{delta} गुण खाली.",
290
+ "{team} {delta} गुण घसरलं. कोणीतरी त्यांना सांभाळा.",
291
+ "{team} ची चाकं उतरली: {delta} गुण वाया.",
292
+ "{team} ने एक शानदार {delta}-गुणी आपत्ती अनुभवली.",
293
+ "{team} ने {delta} गुण टाकले जणू गरम आहेत. पण गरम नाहीत.",
294
+ "{team} चा {delta}-गुणी क्रॅश चुकीच्या कारणांसाठी प्रसिद्ध आहे.",
295
+ "{delta} गुण?? {team} फक्त घसरलं नाही—बुडी मारली.",
296
+ ],
297
+ te: [
298
+ "{team} {delta} పాయింట్లు పడిపోయింది. గురుత్వాకర్షణ ఓవర్ టైం పని చేస్తుంది.",
299
+ "{team} హీరో నుండి జీరో అయ్యింది—{delta} పాయింట్ల పతనం.",
300
+ "{team} {delta} పాయింట్ల కోలాప్స్? ఎప్పుడూ మర్చిపోకండి.",
301
+ "{team} చెప్పింది \"ట్యాంక్ చేద్దాం\" మరియు విజయం సాధించింది—{delta} పాయింట్లు తగ్గి.",
302
+ "{team} {delta} పాయింట్లు కింద పడింది. ఎవరైనా వారిని చూడండి.",
303
+ "{team} చక్రాలు ఊడిపోయాయి: {delta} పాయింట్లు వృథా.",
304
+ "{team} ఒక అద్భుతమైన {delta}-పాయింట్ల విపత్తును ఎదుర్కొంది.",
305
+ "{team} {delta} పాయింట్లు వేసింది హాట్ లా. కానీ హాట్ కాదు.",
306
+ "{team} {delta}-పాయింట్ల క్రాష్ తప్పు కారణాలకు ప్రసిద్ధి.",
307
+ "{delta} పాయింట్లా?? {team} పడలేదు—దూకింది!",
308
+ ],
309
+ };
310
+
311
+ const transferLines: Record<Lang, string[]> = {
312
+ en: [
313
+ "{team} still has {transfers} transfers left. Strategic genius!",
314
+ "{team} is hoarding {transfers} transfers like a dragon with gold.",
315
+ "{team} says \"saving transfers {transfers} left — just warming up\".",
316
+ "{transfers} transfers left? {team} is playing 4D chess.",
317
+ "{team} with {transfers} transfers unused. Patience of a saint.",
318
+ "{team} hasn't touched {transfers} transfers. What's the plan?",
319
+ "{transfers} transfers remaining for {team}. Calculated moves only.",
320
+ "{team} is sitting on {transfers} transfers. The final boss energy.",
321
+ ],
322
+ hi: [
323
+ "{team} के पास अभी भी {transfers} ट्रांसफ़र बचे हैं। रणनीतिक प्रतिभा!",
324
+ "{team} {transfers} ट्रांसफ़र जमा कर रहा है जैसे ड्रैगन सोना जमा करता है।",
325
+ "{team} कहता है \"{transfers} ट्रांसफ़र बचे हैं—बस वार्म अप कर रहे हैं\"।",
326
+ "{transfers} ट्रांसफ़र बचे? {team} 4D शतरंज खेल रहा है।",
327
+ "{team} ने {transfers} ट्रांसफ़र नहीं छुए। संत की तरह धैर्य।",
328
+ "{team} ने {transfers} ट्रांसफ़र को हाथ नहीं लगाया। क्या योजना है?",
329
+ "{team} के पास {transfers} ट्रांसफ़र शेष। केवल गणना किए गए कदम।",
330
+ "{team} {transfers} ट्रांसफ़र पर बैठा है। फाइनल बॉस एनर्जी।",
331
+ ],
332
+ mr: [
333
+ "{team} कडे अजूनही {transfers} ट्रान्सफर शिल्लक आहेत. रणनीतिक प्रतिभा!",
334
+ "{team} {transfers} ट्रान्सफर जमा करतंय जसं ड्रॅगन सोनं जमा करतं.",
335
+ "{team} म्हणतं \"{transfers} ट्रान्सफर शिल्लक—फक्त वॉर्म अप करतोय\".",
336
+ "{transfers} ट्रान्सफर शिल्लक? {team} 4D बुद्धिबळ खेळतंय.",
337
+ "{team} ने {transfers} ट्रान्सफरला हात लावला नाही. संतासारखा संयम.",
338
+ "{team} ने {transfers} ट्रान्सफर वापरले नाहीत. काय योजना आहे?",
339
+ "{team} कडे {transfers} ट्रान्सफर शिल्लक. फक्त मोजलेली पावलं.",
340
+ "{team} {transfers} ट्रान्सफर वर बसलं आहे. फायनल बॉस एनर्जी.",
341
+ ],
342
+ te: [
343
+ "{team} కి ఇంకా {transfers} ట్రాన్స్ఫర్లు మిగిలి ఉన్నాయి. వ్యూహాత్మక ప్రతిభ!",
344
+ "{team} {transfers} ట్రాన్స్ఫర్లు డ్రాగన్ బంగారం లా దాచుకుంటుంది.",
345
+ "{team} చెప్పింది \"{transfers} ట్రాన్స్ఫర్లు మిగిలి ఉన్నాయి — వార్మప్ చేస్తున్నాం\".",
346
+ "{transfers} ట్రాన్స్ఫర్లు మిగిలి ఉన్నాయా? {team} 4D చదరంగం ఆడుతుంది.",
347
+ "{team} {transfers} ట్రాన్స్ఫర్లు టచ్ చేయలేదు. సెయింట్ లా సహనం.",
348
+ "{team} {transfers} ట్రాన్స్ఫర్లు ఉపయోగించలేదు. ప్లాన్ ఏమిటి?",
349
+ "{team} కి {transfers} ట్రాన్స్ఫర్లు మిగిలి ఉన్నాయి. లెక్కబద్ధమైన చర్యలు మాత్రమే.",
350
+ "{team} {transfers} ట్రాన్స్ఫర్లపై కూర్చుంది. ఫైనల్ బాస్ ఎనర్జీ.",
351
+ ],
352
+ };
353
+
354
+ const gapLines: Record<Lang, string[]> = {
355
+ en: [
356
+ "{chaser} chasing {leader} by {gap} pts. Gap缩小 edge-of-seat stuff!",
357
+ "{leader} leads {chaser} by {gap} pts. The throne is shaking.",
358
+ "{gap} pts gap between {leader} and {chaser}. Every match matters now.",
359
+ "{leader} is {gap} pts ahead of {chaser}. Can {chaser} catch up?",
360
+ "The battle is real: {leader} vs {chaser}, {gap} pts apart.",
361
+ "{gap} pts. That's all that separates {leader} and {chaser}.",
362
+ "{chaser} is hungry—{gap} pts behind {leader}. Closing in!",
363
+ "{leader} better watch out. {chaser} is just {gap} pts away.",
364
+ ],
365
+ hi: [
366
+ "{chaser} {leader} का पीछा कर रहा है {gap} अंकों से। रोमांचक!",
367
+ "{leader} {chaser} से {gap} अंक आगे है। सिंहासन हिल रहा है।",
368
+ "{leader} और {chaser} के बीच {gap} अंकों का अंतर। हर मैच मायने रखता है।",
369
+ "{leader} {chaser} से {gap} अंक आगे है। क्या {chaser} पकड़ पाएगा?",
370
+ "असली लड़ाई: {leader} बनाम {chaser}, {gap} अंक का अंतर।",
371
+ "{gap} अंक। बस इतना ही {leader} और {chaser} को अलग करता है।",
372
+ "{chaser} भूखा है—{leader} से {gap} अंक पीछे। नज़दीक आ रहा है!",
373
+ "{leader} सावधान रहे। {chaser} सिर्फ {gap} अंक दूर है।",
374
+ ],
375
+ mr: [
376
+ "{chaser} {leader} चा पाठलाग करत आहे {gap} गुणांनी. रोमांचक!",
377
+ "{leader} {chaser} पेक्षा {gap} गुण पुढे आहे. सिंहासन हादरत आहे.",
378
+ "{leader} आणि {chaser} मध्ये {gap} गुणांचं अंतर. प्रत्येक सामना महत्त्वाचा.",
379
+ "{leader} {chaser} पेक्षा {gap} गुण पुढे. {chaser} पकडू शकेल का?",
380
+ "खरी लढाई: {leader} विरुद्ध {chaser}, {gap} गुणांचं अंतर.",
381
+ "{gap} गुण. एवढंच {leader} आणि {chaser} ला वेगळं करतं.",
382
+ "{chaser} भुकेलं आहे—{leader} पेक्षा {gap} गुण मागे. जवळ येतंय!",
383
+ "{leader} सावध राहा. {chaser} फक्त {gap} गुण दूर आहे.",
384
+ ],
385
+ te: [
386
+ "{chaser} {leader} ను {gap} పాయింట్లతో వెంటాడుతుంది. థ్రిల్లింగ్!",
387
+ "{leader} {chaser} కంటే {gap} పాయింట్లు ముందుంది. సింహాసనం కంపిస్తుంది.",
388
+ "{leader} మరియు {chaser} మధ్య {gap} పాయింట్ల గ్యాప్. ప్రతి మ్యాచ్ ముఖ్యం.",
389
+ "{leader} {chaser} కంటే {gap} పాయింట్లు ముందు. {chaser} క్యాచ్ అప్ చేయగలదా?",
390
+ "నిజమైన పోరాటం: {leader} vs {chaser}, {gap} పాయింట్ల దూరం.",
391
+ "{gap} పాయింట్లు. అంతే {leader} మరియు {chaser} ను వేరు చేస్తుంది.",
392
+ "{chaser} ఆకలితో ఉంది—{leader} కంటే {gap} పాయింట్లు వెనక. దగ్గరవుతుంది!",
393
+ "{leader} జాగ్రత్త. {chaser} కేవలం {gap} పాయింట్ల దూరంలో ఉంది.",
394
+ ],
395
+ };
396
+
397
+ function fill(template: string, vars: Record<string, string | number>): string {
398
+ let result = template;
399
+ for (const [key, val] of Object.entries(vars)) {
400
+ result = result.replaceAll(`{${key}}`, String(val));
401
+ }
402
+ return result;
403
+ }
404
+
405
+ function translate(
406
+ lines: Record<Lang, string[]>,
407
+ lang: Lang,
408
+ vars: Record<string, string | number>,
409
+ ): string {
410
+ const pool = lines[lang] ?? lines.en;
411
+ return fill(pick(pool), vars);
412
+ }
413
+
414
+ export function randomLang(): Lang {
415
+ return pick([...LANGUAGES]);
416
+ }
417
+
418
+ export const aiAgent = {
419
+ praise: (team: string, pts: number, lang?: Lang) =>
420
+ translate(praiseLines, lang ?? randomLang(), { team, pts }),
421
+
422
+ roast: (team: string, pts: number, lang?: Lang) =>
423
+ translate(roastLines, lang ?? randomLang(), { team, pts }),
424
+
425
+ consistency: (team: string, volatility: number, lang?: Lang) =>
426
+ translate(consistencyLines, lang ?? randomLang(), { team, vol: volatility.toFixed(1) }),
427
+
428
+ leader: (team: string, avg: number, lang?: Lang) =>
429
+ translate(leaderLines, lang ?? randomLang(), { team, avg: avg.toFixed(1) }),
430
+
431
+ surge: (team: string, delta: number, day: string, lang?: Lang) =>
432
+ translate(surgeLines, lang ?? randomLang(), { team, delta, day }),
433
+
434
+ collapse: (team: string, delta: number, lang?: Lang) =>
435
+ translate(collapseLines, lang ?? randomLang(), { team, delta: Math.abs(delta) }),
436
+
437
+ transfers: (team: string, transfers: number, lang?: Lang) =>
438
+ translate(transferLines, lang ?? randomLang(), { team, transfers }),
439
+
440
+ gap: (leader: string, chaser: string, gap: number, lang?: Lang) =>
441
+ translate(gapLines, lang ?? randomLang(), { leader, chaser, gap }),
442
+ };
443
+
444
+ export type RoastScenario = keyof typeof aiAgent;
@@ -0,0 +1,29 @@
1
+ import path from "node:path";
2
+
3
+ export const config = {
4
+ mongodb: {
5
+ databaseName: process.env.IPL_DB_NAME || "ipl",
6
+ collectionName: process.env.IPL_COLLECTION_NAME || "ipl",
7
+ },
8
+
9
+ league: {
10
+ defaultUrl: process.env.IPL_LEAGUE_URL || "https://fantasy.iplt20.com/classic/league/view/66930102",
11
+ totalTransfers: Number(process.env.IPL_TOTAL_TRANSFERS) || 160,
12
+ },
13
+
14
+ dashboard: {
15
+ syncIntervalMs: Number(process.env.IPL_SYNC_INTERVAL_MS) || 120000,
16
+ },
17
+
18
+ paths: {
19
+ snapshotFile: path.join(process.cwd(), "app/api/ipl/live-snapshot.json"),
20
+ transferSnapshotFile: path.join(process.cwd(), "app/api/ipl/transfers/live-snapshot.json"),
21
+ seedDataFile: path.join(process.cwd(), "app/api/ipl/data.ts"),
22
+ },
23
+
24
+ docTypes: {
25
+ dashboard: "dashboard",
26
+ rawUsers: "raw-users",
27
+ transferStats: "transfer-stats",
28
+ },
29
+ };
@@ -0,0 +1 @@
1
+ export { buildDashboardModel } from "./model";