gohome

Форк
0
/
handler.go 
311 строк · 11.8 Кб
1
package home
2

3
import (
4
	"html/template"
5
	"net/http"
6
	"strings"
7

8
	lru "github.com/hashicorp/golang-lru/v2"
9
	"go.uber.org/zap"
10

11
	"gohome.4gophers.ru/getapp/gohome/pkg/logger"
12
)
13

14
type Handler struct {
15
	logger   *logger.Logger
16
	template *template.Template
17
	cache    *lru.Cache[string, Meta]
18
}
19

20
func (h *Handler) save(path string) {
21
	if strings.Contains(path, ".") {
22
		return
23
	}
24

25
	if strings.Count(path, "/") <= 1 {
26
		return
27
	}
28

29
	h.cache.Add(path, Meta{
30
		Name: "gohome.4gophers.ru" + path,
31
		Repo: "https://gitflic.ru/project" + path + ".git",
32
	})
33
}
34

35
func New(logger *logger.Logger) *Handler {
36
	l, _ := lru.New[string, Meta](1024)
37

38
	t, err := template.New("test").Parse(tmpl)
39
	if err != nil {
40
		panic(err)
41
	}
42

43
	return &Handler{
44
		logger:   logger,
45
		template: t,
46
		cache:    l,
47
	}
48
}
49

50
func (h *Handler) Home(w http.ResponseWriter, r *http.Request) {
51
	h.logger.Info("url path", zap.String("path", r.URL.Path))
52

53
	path := r.URL.Path
54

55
	h.save(path)
56

57
	data := h.cache.Values()
58

59
	if err := h.template.Execute(w, data); err != nil {
60
		h.logger.Error("error on render template", zap.Error(err))
61
		w.WriteHeader(http.StatusInternalServerError)
62
		return
63
	}
64
}
65

66
type Meta struct {
67
	Name string
68
	Repo string
69
}
70

71
var tmpl = `<!doctype html>
72
<html lang="en">
73
  <head>
74
    <meta charset="utf-8">
75
    <meta name="viewport" content="width=device-width, initial-scale=1">
76
    <meta name="description" content="">
77

78
	{{range .}}
79
	<meta name="go-import" content="{{.Name}} git {{.Repo}}">
80
	{{ end }}
81
    <title>Go Home</title>    
82

83
    <!-- Bootstrap core CSS -->
84
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
85

86

87
    <!-- Favicons -->
88
<link rel="apple-touch-icon" href="/docs/5.0/assets/img/favicons/apple-touch-icon.png" sizes="180x180">
89
<link rel="icon" href="/docs/5.0/assets/img/favicons/favicon-32x32.png" sizes="32x32" type="image/png">
90
<link rel="icon" href="/docs/5.0/assets/img/favicons/favicon-16x16.png" sizes="16x16" type="image/png">
91
<link rel="manifest" href="/docs/5.0/assets/img/favicons/manifest.json">
92
<link rel="mask-icon" href="/docs/5.0/assets/img/favicons/safari-pinned-tab.svg" color="#7952b3">
93
<link rel="icon" href="/docs/5.0/assets/img/favicons/favicon.ico">
94
<meta name="theme-color" content="#7952b3">
95

96

97
    <style>
98
      .bd-placeholder-img {
99
        font-size: 1.125rem;
100
        text-anchor: middle;
101
        -webkit-user-select: none;
102
        -moz-user-select: none;
103
        user-select: none;
104
      }
105

106
      @media (min-width: 768px) {
107
        .bd-placeholder-img-lg {
108
          font-size: 3.5rem;
109
        }
110
      }
111
    </style>
112

113

114
	<style>
115
	.icon-list {
116
		padding-left: 0;
117
		list-style: none;
118
	  }
119
	  .icon-list li {
120
		display: flex;
121
		align-items: flex-start;
122
		margin-bottom: .25rem;
123
	  }
124
	  .icon-list li::before {
125
		display: block;
126
		flex-shrink: 0;
127
		width: 1.5em;
128
		height: 1.5em;
129
		margin-right: .5rem;
130
		content: "";
131
		background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23212529' viewBox='0 0 16 16'%3E%3Cpath d='M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0zM4.5 7.5a.5.5 0 0 0 0 1h5.793l-2.147 2.146a.5.5 0 0 0 .708.708l3-3a.5.5 0 0 0 0-.708l-3-3a.5.5 0 1 0-.708.708L10.293 7.5H4.5z'/%3E%3C/svg%3E") no-repeat center center / 100% auto;
132
	  }
133
	</style>
134

135
<!-- Yandex.Metrika counter -->
136
<script type="text/javascript" >
137
   (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
138
   m[i].l=1*new Date();
139
   for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
140
   k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
141
   (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
142

143
   ym(97474046, "init", {
144
        clickmap:true,
145
        trackLinks:true,
146
        accurateTrackBounce:true
147
   });
148
</script>
149
<noscript><div><img src="https://mc.yandex.ru/watch/97474046" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
150
<!-- /Yandex.Metrika counter -->
151

152
  </head>
153
  <body>
154
    
155
<div class="col-lg-8 mx-auto p-3 py-md-5">
156
  <header class="d-flex align-items-center pb-3 mb-5 border-bottom">
157
    <a href="/" class="d-flex align-items-center text-dark text-decoration-none">
158
	<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
159
 width="32.000000pt" height="64.000000pt" viewBox="0 0 640.000000 1280.000000"
160
 preserveAspectRatio="xMidYMid meet">
161
<metadata>
162
Created by potrace 1.15, written by Peter Selinger 2001-2017
163
</metadata>
164
<g transform="translate(0.000000,1280.000000) scale(0.100000,-0.100000)"
165
fill="#000000" stroke="none">
166
<path d="M2870 12785 c-25 -8 -96 -43 -157 -79 -182 -104 -264 -126 -475 -126
167
-101 0 -123 3 -202 31 -69 24 -98 29 -131 24 -94 -14 -180 -102 -212 -216
168
l-16 -56 -80 -34 c-118 -50 -181 -94 -280 -198 -97 -103 -127 -152 -127 -209
169
0 -38 -2 -41 -47 -60 -80 -34 -208 -69 -408 -113 -242 -52 -334 -81 -366 -115
170
-20 -22 -24 -35 -24 -92 0 -65 2 -71 65 -176 69 -116 165 -228 236 -277 26
171
-17 44 -38 44 -49 0 -10 -14 -53 -31 -96 -30 -74 -31 -81 -19 -133 10 -44 22
172
-64 64 -106 60 -61 154 -109 251 -131 41 -9 157 -18 280 -23 240 -9 285 -21
173
350 -93 44 -48 56 -78 57 -139 0 -50 -16 -89 -68 -160 -38 -52 -40 -61 -19
174
-79 22 -18 19 -35 -20 -94 -66 -99 -55 -156 35 -171 83 -14 56 -65 -35 -65
175
-93 0 -113 -58 -46 -127 37 -38 39 -42 31 -79 -5 -21 -20 -69 -34 -107 -15
176
-37 -26 -82 -26 -100 0 -21 -16 -56 -45 -101 -47 -73 -56 -114 -29 -140 25
177
-25 62 -19 140 24 44 24 75 36 79 30 4 -6 -10 -48 -29 -94 -20 -46 -36 -89
178
-36 -96 0 -21 -54 -112 -124 -207 -35 -48 -74 -108 -86 -132 -59 -117 -100
179
-265 -100 -361 0 -32 -9 -102 -20 -156 l-19 -98 20 -22 c20 -22 20 -24 5 -130
180
-32 -210 -65 -312 -138 -416 -48 -68 -101 -115 -322 -284 -323 -246 -445 -401
181
-492 -627 -26 -123 1 -250 67 -322 21 -23 65 -93 96 -156 55 -109 61 -116 126
182
-160 37 -26 112 -84 167 -130 135 -113 200 -154 290 -184 154 -51 223 -42 299
183
40 58 63 78 106 105 228 4 18 13 27 26 27 31 0 37 45 11 80 -15 21 -21 44 -21
184
81 l0 52 83 -6 c94 -6 173 -28 211 -58 22 -17 26 -28 26 -69 0 -27 -9 -88 -20
185
-135 -11 -47 -20 -115 -20 -152 0 -57 2 -64 15 -53 18 15 18 20 0 -105 -8 -55
186
-15 -148 -15 -207 0 -99 2 -109 25 -136 19 -22 25 -41 25 -75 0 -32 12 -74 39
187
-134 32 -75 54 -136 101 -285 8 -24 4 -29 -40 -56 -27 -17 -58 -33 -69 -37
188
-12 -3 -21 -10 -21 -15 0 -9 44 -46 63 -53 14 -4 1 -26 -89 -148 -66 -89 -73
189
-106 -52 -127 18 -18 42 -15 73 10 15 12 26 18 24 12 -35 -83 -41 -106 -35
190
-139 9 -49 33 -56 63 -19 21 27 23 28 23 7 0 -12 8 -26 17 -32 15 -8 15 -11 4
191
-25 -12 -14 -12 -23 -1 -55 7 -23 10 -54 6 -75 -6 -29 -4 -36 9 -36 27 0 17
192
-55 -35 -199 -59 -160 -77 -269 -86 -511 -5 -116 -2 -183 10 -265 22 -152 32
193
-187 55 -180 15 5 32 -23 101 -165 61 -123 88 -170 101 -170 13 0 26 -26 53
194
-108 20 -60 52 -131 70 -158 30 -43 38 -71 71 -239 88 -450 44 -599 -180 -612
195
-38 -2 -124 -15 -190 -28 -66 -13 -169 -32 -230 -43 -60 -11 -136 -30 -167
196
-42 -172 -64 -290 -206 -313 -376 -8 -59 3 -73 37 -50 20 14 23 13 57 -22 45
197
-46 158 -115 249 -152 183 -74 355 -84 562 -31 69 17 208 42 310 56 102 14
198
227 32 278 41 116 21 208 15 357 -21 60 -15 135 -27 166 -27 134 0 237 95 300
199
275 16 45 36 85 48 94 25 17 27 50 4 97 -14 31 -15 41 -3 75 9 27 11 62 6 108
200
-16 166 -18 212 -7 263 13 63 29 93 38 71 9 -21 42 -51 57 -51 11 0 13 34 12
201
183 -1 177 0 183 24 226 14 25 30 46 35 48 6 2 23 -22 39 -52 30 -58 71 -99
202
92 -91 7 3 28 -34 54 -95 55 -130 154 -281 181 -277 15 2 28 -12 54 -57 68
203
-115 78 -146 83 -233 5 -91 0 -85 61 -66 15 4 27 -10 63 -73 87 -150 138 -242
204
138 -246 0 -14 -77 -12 -169 5 -90 16 -119 17 -191 8 -365 -47 -509 -128 -624
205
-353 -60 -117 -64 -162 -22 -206 60 -62 168 -107 451 -186 171 -47 196 -50
206
291 -31 174 36 315 47 709 56 593 13 659 24 749 120 55 58 82 111 105 203 10
207
39 25 73 32 76 8 2 17 9 21 15 13 20 8 138 -12 281 -24 168 -25 224 -5 358 22
208
143 34 179 56 172 31 -10 59 48 59 125 0 49 7 79 26 120 45 95 63 159 94 329
209
32 172 67 311 80 311 4 0 14 -10 23 -22 24 -37 32 -13 31 95 -1 75 -10 139
210
-33 241 -29 132 -40 237 -23 235 49 -8 42 54 -33 301 -12 41 -25 90 -29 108
211
-6 33 -5 33 24 27 17 -4 30 -3 30 1 0 22 -51 171 -110 324 -87 225 -108 293
212
-122 404 -10 80 -8 108 11 234 27 179 49 262 105 413 82 218 106 335 137 673
213
14 157 6 462 -16 601 -37 232 -94 444 -240 895 -36 113 -82 260 -101 328 -19
214
68 -44 146 -55 175 -24 61 -123 479 -179 757 -83 415 -108 767 -75 1055 49
215
418 26 665 -82 880 -68 136 -131 204 -318 341 -266 195 -587 479 -681 602 -48
216
64 -100 157 -196 352 -72 146 -147 289 -166 319 -22 32 -72 82 -126 126 -159
217
127 -293 273 -438 477 -25 36 -77 90 -115 121 -38 30 -84 71 -102 92 -33 38
218
-33 40 -25 99 4 34 8 93 8 131 0 115 -49 183 -157 219 -57 19 -97 19 -157 1z"/>
219
</g>
220
</svg>
221
      <span class="fs-4">&nbsp;&nbsp;Go Home</span>
222
    </a>
223
  </header>
224

225
  <main>
226
    <h1>Домен для Go пакетов</h1>
227
	<p></p>
228
    <p class="fs-5 col-md-10">
229
	  Очень легко устанавливать Go пакеты с гитхаба. Но все сложнее если библиотека лежит на gitflic.ru. Тут обычный <code>go get</code> не сработает.
230
	</p>
231
	<p class="fs-5 col-md-10">
232
	  Для этого есть <code>Go Home</code>. С его помощью пакеты можно устанавливать через <code>go get</code>.
233
	</p>
234

235
	<p class="fs-5 col-md-10">
236
	  Для начала нужно создать пакет, название которого будет начинаться с <code>gohome.4gophers.ru</code>:
237

238
<pre>
239
go mod init gohome.4gophers.ru/kovardin/example
240
</pre>
241
	
242
	</p>
243
	<p class="fs-5 col-md-10">  
244
	  После этого создать репозиторий на gitflic: 
245
<pre>
246
https://gitflic.ru/project/kovardin/example
247
</pre>
248

249
	</p>
250

251
	<p class="fs-5 col-md-8">
252
	Теперь вы можете указывать в своем коде зависимость
253

254
<pre>
255
package main
256

257
import (
258
	"fmt"
259

260
	"gohome.4gophers.ru/kovardin/example"
261
)
262

263
func main() {
264
	fmt.Println(example.Hello("Artem"))
265
}
266
</pre>
267
	</p>
268

269
	<p class="fs-5 col-md-10">
270
	Go разрулит зависимости через meta теги на этом сайте и установит зависимость.
271
	</p>
272

273
    <hr class="col-3 col-md-2 mb-5">
274

275
    <div class="row g-5">
276
      <div class="col-md-6">
277
        <h2>Ссылки</h2>
278
        <p>Как работает и что за giflic такой.</p>
279
        <ul class="icon-list">
280
          <li><a href="https://gitflic.ru/project/getapp/gohome" rel="noopener" target="_blank">Исходники сервиса</a></li>
281
          <li><a href="https://pkg.go.dev/cmd/go#hdr-Remote_import_paths" rel="noopener" target="_blank">Как работает импорт пакетов</a></li>
282
          <li><a href="https://gitflic.ru/user/kovardin" rel="noopener" target="_blank">Да кто это ваш giflic</a></li>
283
          <li><a href="https://t.me/kodikapusta" rel="noopener" target="_blank">Код и капуста</a></li>
284
        </ul>
285
      </div>
286

287
      <div class="col-md-6">
288
        <h2>Статьи</h2>
289
        <p>Еще немножко почитать на разные темы.</p>
290
        <ul class="icon-list">
291
          <li><a href="https://kovardin.ru/articles/ads/mediation/">Про мобильную медиацию</a></li>
292
          <li><a href="https://kovardin.ru/articles/mobile/boosty-android/">Как использовать boosty для мобильного приложения</a></li>
293
          <li><a href="https://kovardin.ru/articles/godot/mytacker-and-app-metrica/">Подключаем MyTracker и AppMetrica к игре на Godot</a></li>
294
          <li><a href="https://kovardin.ru/articles/godot/first-game/">Первая игра на Godot</a></li>
295
        </ul>
296
      </div>
297
    </div>
298
  </main>
299
  <footer class="pt-5 my-5 text-muted border-top">
300
    Ковардин Артем &middot; &copy; 2024
301
  </footer>
302
</div>
303

304

305
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
306
      
307
  </body>
308
</html>
309

310

311
`
312

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.