dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit d124d172d461b4c143df53e0edd53a3e99b03929
parent 9fc3bfcaaf12fccf5daa3b917723510df9923486
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Wed,  7 Jun 2023 02:21:59 -0700

first version of code modal

Diffstat:
Mpkg/web/handlers/api/v1/messages.qtpl | 22++++++++++++++++++++++
Mpkg/web/handlers/api/v1/messages.qtpl.go | 1066++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mpkg/web/handlers/api/v1/slashInterceptor.go | 14++++++++++++++
Mpkg/web/handlers/api/v1/topBarHandler.go | 17+++++++++++++++++
Mpkg/web/handlers/handlers.go | 36++++++++++++++++++++++++++++++++++++
5 files changed, 633 insertions(+), 522 deletions(-)

diff --git a/pkg/web/handlers/api/v1/messages.qtpl b/pkg/web/handlers/api/v1/messages.qtpl @@ -198,6 +198,28 @@ } @keyframes i1 { 0% { background-color: #006400; } 32% { background-color: #006400; } 33% { background-color: #626400; } 99% { background-color: #626400; } 100% { background-color: #8b0000; } } @keyframes i2 { 0% { background-color: #006400; } 32% { background-color: #006400; } 33% { background-color: #626400; } 99% { background-color: #626400; } 100% { background-color: #8b0000; } } + .code-modal { + display: block; + width: calc(100% - 185px - 100px); + height: calc(100% - 50px); + position: absolute; + top: 0; + left: calc(50% - ((100% - 185px - 100px)/2) - 92px); + background-color: gray; + z-index: 999; + border-radius: 5px; + } + .code-modal textarea { + position: absolute; + top: 10px; left: 10px; right: 10px; bottom: 30px; + background-color: rgba(79,79,79,1); + color: #fff; + border: 1px solid rgba(90,90,90,1); + } + .code-modal .controls { + position: absolute; + left: 10px; right: 10px; bottom: 5px; + } </style> {%- endfunc -%} diff --git a/pkg/web/handlers/api/v1/messages.qtpl.go b/pkg/web/handlers/api/v1/messages.qtpl.go @@ -260,88 +260,110 @@ func StreamGenerateStyle(qw422016 *qt422016.Writer, AuthUser *database.User, Dat } @keyframes i1 { 0% { background-color: #006400; } 32% { background-color: #006400; } 33% { background-color: #626400; } 99% { background-color: #626400; } 100% { background-color: #8b0000; } } @keyframes i2 { 0% { background-color: #006400; } 32% { background-color: #006400; } 33% { background-color: #626400; } 99% { background-color: #626400; } 100% { background-color: #8b0000; } } + .code-modal { + display: block; + width: calc(100% - 185px - 100px); + height: calc(100% - 50px); + position: absolute; + top: 0; + left: calc(50% - ((100% - 185px - 100px)/2) - 92px); + background-color: gray; + z-index: 999; + border-radius: 5px; + } + .code-modal textarea { + position: absolute; + top: 10px; left: 10px; right: 10px; bottom: 30px; + background-color: rgba(79,79,79,1); + color: #fff; + border: 1px solid rgba(90,90,90,1); + } + .code-modal .controls { + position: absolute; + left: 10px; right: 10px; bottom: 5px; + } </style> `) -//line messages.qtpl:202 +//line messages.qtpl:224 } -//line messages.qtpl:202 +//line messages.qtpl:224 func WriteGenerateStyle(qq422016 qtio422016.Writer, AuthUser *database.User, Data ChatMessagesData) { -//line messages.qtpl:202 +//line messages.qtpl:224 qw422016 := qt422016.AcquireWriter(qq422016) -//line messages.qtpl:202 +//line messages.qtpl:224 StreamGenerateStyle(qw422016, AuthUser, Data) -//line messages.qtpl:202 +//line messages.qtpl:224 qt422016.ReleaseWriter(qw422016) -//line messages.qtpl:202 +//line messages.qtpl:224 } -//line messages.qtpl:202 +//line messages.qtpl:224 func GenerateStyle(AuthUser *database.User, Data ChatMessagesData) string { -//line messages.qtpl:202 +//line messages.qtpl:224 qb422016 := qt422016.AcquireByteBuffer() -//line messages.qtpl:202 +//line messages.qtpl:224 WriteGenerateStyle(qb422016, AuthUser, Data) -//line messages.qtpl:202 +//line messages.qtpl:224 qs422016 := string(qb422016.B) -//line messages.qtpl:202 +//line messages.qtpl:224 qt422016.ReleaseByteBuffer(qb422016) -//line messages.qtpl:202 +//line messages.qtpl:224 return qs422016 -//line messages.qtpl:202 +//line messages.qtpl:224 } -//line messages.qtpl:204 +//line messages.qtpl:226 func StreamMessages(qw422016 *qt422016.Writer, VERSION, CSRF, NullUsername string, AuthUser *database.User, Data ChatMessagesData) { -//line messages.qtpl:204 +//line messages.qtpl:226 qw422016.N().S(`<html lang="en"> <head> <title></title> `) -//line messages.qtpl:208 +//line messages.qtpl:230 if !Data.ChatMenuData.PreventRefresh && !Data.ForceManualRefresh { -//line messages.qtpl:208 +//line messages.qtpl:230 qw422016.N().S(`<meta http-equiv="refresh" content="`) -//line messages.qtpl:208 +//line messages.qtpl:230 qw422016.N().DL(AuthUser.RefreshRate) -//line messages.qtpl:208 +//line messages.qtpl:230 qw422016.N().S(`">`) -//line messages.qtpl:208 +//line messages.qtpl:230 } -//line messages.qtpl:209 +//line messages.qtpl:231 if AuthUser.CollectMetadata { -//line messages.qtpl:209 +//line messages.qtpl:231 qw422016.N().S(`<link rel="stylesheet" type="text/css" href="/public/css/meta.css?v=`) -//line messages.qtpl:209 +//line messages.qtpl:231 qw422016.E().S(VERSION) -//line messages.qtpl:209 +//line messages.qtpl:231 qw422016.N().S(`" />`) -//line messages.qtpl:209 +//line messages.qtpl:231 } -//line messages.qtpl:210 +//line messages.qtpl:232 StreamGenerateStyle(qw422016, AuthUser, Data) -//line messages.qtpl:210 +//line messages.qtpl:232 qw422016.N().S(` </head> <body> `) -//line messages.qtpl:214 +//line messages.qtpl:236 if Data.ForceManualRefresh { -//line messages.qtpl:214 +//line messages.qtpl:236 qw422016.N().S(` <div id="manualrefresh"> <h4>Manual refresh required</h4> <form method="get" action="/chat/`) -//line messages.qtpl:217 +//line messages.qtpl:239 qw422016.E().S(Data.ChatMenuData.RoomName) -//line messages.qtpl:217 +//line messages.qtpl:239 qw422016.N().S(`" target="_top"> <input type="submit" value="Reload" /> </form> </div> `) -//line messages.qtpl:221 +//line messages.qtpl:243 } else if !Data.ChatMenuData.PreventRefresh { -//line messages.qtpl:221 +//line messages.qtpl:243 qw422016.N().S(` <div id="manualrefresh"> <h4>Manual refresh required</h4> <form method="get"> @@ -349,1113 +371,1113 @@ func StreamMessages(qw422016 *qt422016.Writer, VERSION, CSRF, NullUsername strin </form> </div> `) -//line messages.qtpl:228 +//line messages.qtpl:250 } -//line messages.qtpl:228 +//line messages.qtpl:250 qw422016.N().S(` `) -//line messages.qtpl:230 +//line messages.qtpl:252 if Data.Error != "" { -//line messages.qtpl:230 +//line messages.qtpl:252 qw422016.N().S(` <a href="/api/v1/chat/messages/`) -//line messages.qtpl:231 +//line messages.qtpl:253 qw422016.E().S(Data.ChatMenuData.RoomName) -//line messages.qtpl:231 +//line messages.qtpl:253 qw422016.N().S(`" id="msg-err">× `) -//line messages.qtpl:231 +//line messages.qtpl:253 qw422016.E().S(Data.Error) -//line messages.qtpl:231 +//line messages.qtpl:253 qw422016.N().S(`</a> `) -//line messages.qtpl:232 +//line messages.qtpl:254 } -//line messages.qtpl:232 +//line messages.qtpl:254 qw422016.N().S(` `) -//line messages.qtpl:234 +//line messages.qtpl:256 if Data.PmSound || Data.TaggedSound { -//line messages.qtpl:234 +//line messages.qtpl:256 qw422016.N().S(` <audio src="/public/mp3/sound5.mp3" autoplay></audio> `) -//line messages.qtpl:236 +//line messages.qtpl:258 } else if Data.NewMessageSound { -//line messages.qtpl:236 +//line messages.qtpl:258 qw422016.N().S(` <audio src="/public/mp3/sound6.mp3" autoplay></audio> `) -//line messages.qtpl:238 +//line messages.qtpl:260 } -//line messages.qtpl:238 +//line messages.qtpl:260 qw422016.N().S(` <div id="msgs"> `) -//line messages.qtpl:241 +//line messages.qtpl:263 StreamRenderMessages(qw422016, AuthUser, Data, CSRF, NullUsername) -//line messages.qtpl:241 +//line messages.qtpl:263 qw422016.N().S(` </div> `) -//line messages.qtpl:244 +//line messages.qtpl:266 if !AuthUser.HideRightColumn { -//line messages.qtpl:244 +//line messages.qtpl:266 qw422016.N().S(` <div id="rgt-pane-w"> `) -//line messages.qtpl:246 +//line messages.qtpl:268 StreamRenderRightColumn(qw422016, AuthUser, Data.ChatMenuData) -//line messages.qtpl:246 +//line messages.qtpl:268 qw422016.N().S(` </div> `) -//line messages.qtpl:248 +//line messages.qtpl:270 } -//line messages.qtpl:249 +//line messages.qtpl:271 if AuthUser.CollectMetadata { -//line messages.qtpl:249 +//line messages.qtpl:271 qw422016.N().S(` <div class="div_1"></div> <div class="div_2"></div> <div class="div_f0">a</div> `) -//line messages.qtpl:253 +//line messages.qtpl:275 } -//line messages.qtpl:253 +//line messages.qtpl:275 qw422016.N().S(` </body> </html> `) -//line messages.qtpl:256 +//line messages.qtpl:278 } -//line messages.qtpl:256 +//line messages.qtpl:278 func WriteMessages(qq422016 qtio422016.Writer, VERSION, CSRF, NullUsername string, AuthUser *database.User, Data ChatMessagesData) { -//line messages.qtpl:256 +//line messages.qtpl:278 qw422016 := qt422016.AcquireWriter(qq422016) -//line messages.qtpl:256 +//line messages.qtpl:278 StreamMessages(qw422016, VERSION, CSRF, NullUsername, AuthUser, Data) -//line messages.qtpl:256 +//line messages.qtpl:278 qt422016.ReleaseWriter(qw422016) -//line messages.qtpl:256 +//line messages.qtpl:278 } -//line messages.qtpl:256 +//line messages.qtpl:278 func Messages(VERSION, CSRF, NullUsername string, AuthUser *database.User, Data ChatMessagesData) string { -//line messages.qtpl:256 +//line messages.qtpl:278 qb422016 := qt422016.AcquireByteBuffer() -//line messages.qtpl:256 +//line messages.qtpl:278 WriteMessages(qb422016, VERSION, CSRF, NullUsername, AuthUser, Data) -//line messages.qtpl:256 +//line messages.qtpl:278 qs422016 := string(qb422016.B) -//line messages.qtpl:256 +//line messages.qtpl:278 qt422016.ReleaseByteBuffer(qb422016) -//line messages.qtpl:256 +//line messages.qtpl:278 return qs422016 -//line messages.qtpl:256 +//line messages.qtpl:278 } -//line messages.qtpl:259 +//line messages.qtpl:281 func StreamRenderRightColumn(qw422016 *qt422016.Writer, AuthUser *database.User, Data ChatMenuData) { -//line messages.qtpl:259 +//line messages.qtpl:281 qw422016.N().S(`<div id="rgt-pane"> <div class="mb-20px"> <div class="rgt-title">Inbox (<a href="/settings/inbox" target="_top"`) -//line messages.qtpl:262 +//line messages.qtpl:284 if Data.InboxCount > 0 { -//line messages.qtpl:262 +//line messages.qtpl:284 qw422016.N().S(`class="notif"`) -//line messages.qtpl:262 +//line messages.qtpl:284 } -//line messages.qtpl:262 +//line messages.qtpl:284 qw422016.N().S(`>`) -//line messages.qtpl:262 +//line messages.qtpl:284 qw422016.N().DL(Data.InboxCount) -//line messages.qtpl:262 +//line messages.qtpl:284 qw422016.N().S(`</a>)</div> </div> <div class="mb-20px"> <div class="rgt-title">Rooms:</div> `) -//line messages.qtpl:266 +//line messages.qtpl:288 for _, e := range Data.OfficialRooms { -//line messages.qtpl:267 +//line messages.qtpl:289 if e.Name == "club" { -//line messages.qtpl:268 +//line messages.qtpl:290 if AuthUser.IsClubMember { -//line messages.qtpl:268 +//line messages.qtpl:290 qw422016.N().S(` <div><a href="/chat/club" target="_top"`) -//line messages.qtpl:269 +//line messages.qtpl:291 if e.IsUnread { -//line messages.qtpl:269 +//line messages.qtpl:291 qw422016.N().S(` class="unread_room"`) -//line messages.qtpl:269 +//line messages.qtpl:291 } -//line messages.qtpl:269 +//line messages.qtpl:291 qw422016.N().S(`>#club</a></div> `) -//line messages.qtpl:270 +//line messages.qtpl:292 } -//line messages.qtpl:271 +//line messages.qtpl:293 } else if e.Name == "moderators" { -//line messages.qtpl:272 +//line messages.qtpl:294 if AuthUser.IsModerator() { -//line messages.qtpl:272 +//line messages.qtpl:294 qw422016.N().S(` <div><a href="/chat/moderators" target="_top"`) -//line messages.qtpl:273 +//line messages.qtpl:295 if e.IsUnread { -//line messages.qtpl:273 +//line messages.qtpl:295 qw422016.N().S(` class="unread_room"`) -//line messages.qtpl:273 +//line messages.qtpl:295 } -//line messages.qtpl:273 +//line messages.qtpl:295 qw422016.N().S(`>#moderators</a></div> `) -//line messages.qtpl:274 +//line messages.qtpl:296 } -//line messages.qtpl:275 +//line messages.qtpl:297 } else { -//line messages.qtpl:275 +//line messages.qtpl:297 qw422016.N().S(` <div><a href="/chat/`) -//line messages.qtpl:276 +//line messages.qtpl:298 qw422016.E().S(e.Name) -//line messages.qtpl:276 +//line messages.qtpl:298 qw422016.N().S(`" target="_top"`) -//line messages.qtpl:276 +//line messages.qtpl:298 if e.IsUnread { -//line messages.qtpl:276 +//line messages.qtpl:298 qw422016.N().S(` class="unread_room"`) -//line messages.qtpl:276 +//line messages.qtpl:298 } -//line messages.qtpl:276 +//line messages.qtpl:298 qw422016.N().S(`>#`) -//line messages.qtpl:276 +//line messages.qtpl:298 qw422016.E().S(e.Name) -//line messages.qtpl:276 +//line messages.qtpl:298 qw422016.N().S(`</a></div> `) -//line messages.qtpl:277 +//line messages.qtpl:299 } -//line messages.qtpl:278 +//line messages.qtpl:300 } -//line messages.qtpl:279 +//line messages.qtpl:301 if len(Data.SubscribedRooms) > 0 { -//line messages.qtpl:279 +//line messages.qtpl:301 qw422016.N().S(` <div class="mt-10px"></div> `) -//line messages.qtpl:281 +//line messages.qtpl:303 for _, e := range Data.SubscribedRooms { -//line messages.qtpl:281 +//line messages.qtpl:303 qw422016.N().S(` <div><a href="/chat/`) -//line messages.qtpl:282 +//line messages.qtpl:304 qw422016.E().S(e.Name) -//line messages.qtpl:282 +//line messages.qtpl:304 qw422016.N().S(`" target="_top"`) -//line messages.qtpl:282 +//line messages.qtpl:304 if e.IsUnread { -//line messages.qtpl:282 +//line messages.qtpl:304 qw422016.N().S(` class="unread_room"`) -//line messages.qtpl:282 +//line messages.qtpl:304 } -//line messages.qtpl:282 +//line messages.qtpl:304 qw422016.N().S(`>#`) -//line messages.qtpl:282 +//line messages.qtpl:304 qw422016.E().S(e.Name) -//line messages.qtpl:282 +//line messages.qtpl:304 qw422016.N().S(`</a></div> `) -//line messages.qtpl:283 +//line messages.qtpl:305 } -//line messages.qtpl:284 +//line messages.qtpl:306 } -//line messages.qtpl:284 +//line messages.qtpl:306 qw422016.N().S(` <div class="mt-5px"><a href="/rooms" target="_top">[...]</a></div> </div> <div class="mb-20px"> <div class="rgt-title">In this room:</div> `) -//line messages.qtpl:289 +//line messages.qtpl:311 for _, e := range Data.Members { -//line messages.qtpl:289 +//line messages.qtpl:311 qw422016.N().S(` `) -//line messages.qtpl:290 +//line messages.qtpl:312 StreamMember(qw422016, AuthUser, Data, e) -//line messages.qtpl:290 +//line messages.qtpl:312 qw422016.N().S(` `) -//line messages.qtpl:291 +//line messages.qtpl:313 } -//line messages.qtpl:291 +//line messages.qtpl:313 qw422016.N().S(` </div> `) -//line messages.qtpl:293 +//line messages.qtpl:315 if Data.VisibleMemberInChat || AuthUser.DisplayHellbanned { -//line messages.qtpl:293 +//line messages.qtpl:315 qw422016.N().S(` <div class="mb-30px"> `) -//line messages.qtpl:295 +//line messages.qtpl:317 if len(Data.MembersInChat) > 0 { -//line messages.qtpl:295 +//line messages.qtpl:317 qw422016.N().S(` <div class="rgt-title">In other rooms:</div> `) -//line messages.qtpl:297 +//line messages.qtpl:319 for _, e := range Data.MembersInChat { -//line messages.qtpl:297 +//line messages.qtpl:319 qw422016.N().S(` `) -//line messages.qtpl:298 +//line messages.qtpl:320 StreamMember(qw422016, AuthUser, Data, e) -//line messages.qtpl:298 +//line messages.qtpl:320 qw422016.N().S(` `) -//line messages.qtpl:299 +//line messages.qtpl:321 } -//line messages.qtpl:300 +//line messages.qtpl:322 } -//line messages.qtpl:300 +//line messages.qtpl:322 qw422016.N().S(` </div> `) -//line messages.qtpl:302 +//line messages.qtpl:324 } -//line messages.qtpl:302 +//line messages.qtpl:324 qw422016.N().S(`</div> `) -//line messages.qtpl:304 +//line messages.qtpl:326 } -//line messages.qtpl:304 +//line messages.qtpl:326 func WriteRenderRightColumn(qq422016 qtio422016.Writer, AuthUser *database.User, Data ChatMenuData) { -//line messages.qtpl:304 +//line messages.qtpl:326 qw422016 := qt422016.AcquireWriter(qq422016) -//line messages.qtpl:304 +//line messages.qtpl:326 StreamRenderRightColumn(qw422016, AuthUser, Data) -//line messages.qtpl:304 +//line messages.qtpl:326 qt422016.ReleaseWriter(qw422016) -//line messages.qtpl:304 +//line messages.qtpl:326 } -//line messages.qtpl:304 +//line messages.qtpl:326 func RenderRightColumn(AuthUser *database.User, Data ChatMenuData) string { -//line messages.qtpl:304 +//line messages.qtpl:326 qb422016 := qt422016.AcquireByteBuffer() -//line messages.qtpl:304 +//line messages.qtpl:326 WriteRenderRightColumn(qb422016, AuthUser, Data) -//line messages.qtpl:304 +//line messages.qtpl:326 qs422016 := string(qb422016.B) -//line messages.qtpl:304 +//line messages.qtpl:326 qt422016.ReleaseByteBuffer(qb422016) -//line messages.qtpl:304 +//line messages.qtpl:326 return qs422016 -//line messages.qtpl:304 +//line messages.qtpl:326 } -//line messages.qtpl:306 +//line messages.qtpl:328 func StreamRenderMessages(qw422016 *qt422016.Writer, AuthUser *database.User, Data ChatMessagesData, CSRF, NullUsername string) { -//line messages.qtpl:308 +//line messages.qtpl:330 baseTopBarURL := "/api/v1/chat/top-bar/" + Data.ChatMenuData.RoomName readMarkerRendered := false isFirstMsg := true -//line messages.qtpl:312 +//line messages.qtpl:334 for idx, e := range Data.Messages { -//line messages.qtpl:313 +//line messages.qtpl:335 StreamRenderMessage(qw422016, idx, e, AuthUser, Data, baseTopBarURL, &readMarkerRendered, &isFirstMsg, CSRF, NullUsername) -//line messages.qtpl:313 +//line messages.qtpl:335 qw422016.N().S(` `) -//line messages.qtpl:314 +//line messages.qtpl:336 } -//line messages.qtpl:314 +//line messages.qtpl:336 qw422016.N().S(` `) -//line messages.qtpl:315 +//line messages.qtpl:337 if len(Data.Messages) == 0 { -//line messages.qtpl:315 +//line messages.qtpl:337 qw422016.N().S(` <div id="no-msg"><em>No message yet</em></div> `) -//line messages.qtpl:317 +//line messages.qtpl:339 } -//line messages.qtpl:317 +//line messages.qtpl:339 qw422016.N().S(` `) -//line messages.qtpl:318 +//line messages.qtpl:340 } -//line messages.qtpl:318 +//line messages.qtpl:340 func WriteRenderMessages(qq422016 qtio422016.Writer, AuthUser *database.User, Data ChatMessagesData, CSRF, NullUsername string) { -//line messages.qtpl:318 +//line messages.qtpl:340 qw422016 := qt422016.AcquireWriter(qq422016) -//line messages.qtpl:318 +//line messages.qtpl:340 StreamRenderMessages(qw422016, AuthUser, Data, CSRF, NullUsername) -//line messages.qtpl:318 +//line messages.qtpl:340 qt422016.ReleaseWriter(qw422016) -//line messages.qtpl:318 +//line messages.qtpl:340 } -//line messages.qtpl:318 +//line messages.qtpl:340 func RenderMessages(AuthUser *database.User, Data ChatMessagesData, CSRF, NullUsername string) string { -//line messages.qtpl:318 +//line messages.qtpl:340 qb422016 := qt422016.AcquireByteBuffer() -//line messages.qtpl:318 +//line messages.qtpl:340 WriteRenderMessages(qb422016, AuthUser, Data, CSRF, NullUsername) -//line messages.qtpl:318 +//line messages.qtpl:340 qs422016 := string(qb422016.B) -//line messages.qtpl:318 +//line messages.qtpl:340 qt422016.ReleaseByteBuffer(qb422016) -//line messages.qtpl:318 +//line messages.qtpl:340 return qs422016 -//line messages.qtpl:318 +//line messages.qtpl:340 } -//line messages.qtpl:320 +//line messages.qtpl:342 func StreamRenderMessage(qw422016 *qt422016.Writer, idx int, e database.ChatMessage, AuthUser *database.User, Data ChatMessagesData, baseTopBarURL string, readMarkerRendered, isFirstMsg *bool, CSRF, NullUsername string) { -//line messages.qtpl:322 +//line messages.qtpl:344 if e.UserCanSee(*AuthUser) { -//line messages.qtpl:323 +//line messages.qtpl:345 if AuthUser.ChatReadMarkerEnabled && e.CreatedAt.Before(Data.ReadMarker.ReadAt) && !*readMarkerRendered { -//line messages.qtpl:323 +//line messages.qtpl:345 qw422016.N().S(` <div class="read-marker read-marker-0"`) -//line messages.qtpl:324 +//line messages.qtpl:346 if idx == 0 { -//line messages.qtpl:324 +//line messages.qtpl:346 qw422016.N().S(` style="display:none;"`) -//line messages.qtpl:324 +//line messages.qtpl:346 } -//line messages.qtpl:324 +//line messages.qtpl:346 qw422016.N().S(`></div> `) -//line messages.qtpl:325 +//line messages.qtpl:347 *readMarkerRendered = true -//line messages.qtpl:326 +//line messages.qtpl:348 } -//line messages.qtpl:326 +//line messages.qtpl:348 qw422016.N().S(` <div id="msgid-`) -//line messages.qtpl:327 +//line messages.qtpl:349 qw422016.E().S(e.UUID) -//line messages.qtpl:327 +//line messages.qtpl:349 qw422016.N().S(`" class="msgidc-`) -//line messages.qtpl:327 +//line messages.qtpl:349 qw422016.E().S(e.UUID) -//line messages.qtpl:327 +//line messages.qtpl:349 qw422016.N().S(`-`) -//line messages.qtpl:327 +//line messages.qtpl:349 qw422016.N().DL(e.Rev) -//line messages.qtpl:327 +//line messages.qtpl:349 qw422016.N().S(` msg `) -//line messages.qtpl:328 +//line messages.qtpl:350 if (e.User.IsHellbanned || e.IsHellbanned) && AuthUser.DisplayHellbanned { -//line messages.qtpl:328 +//line messages.qtpl:350 qw422016.N().S(` hb-row `) -//line messages.qtpl:329 +//line messages.qtpl:351 } else if AuthUser.ID == e.User.ID && AuthUser.HighlightOwnMessages { -//line messages.qtpl:329 +//line messages.qtpl:351 qw422016.N().S(` own-highlight`) -//line messages.qtpl:329 +//line messages.qtpl:351 } -//line messages.qtpl:329 +//line messages.qtpl:351 qw422016.N().S(` "> `) -//line messages.qtpl:331 +//line messages.qtpl:353 if e.UserCanDelete(*AuthUser) { -//line messages.qtpl:332 +//line messages.qtpl:354 if !e.TooOldToDelete() { -//line messages.qtpl:333 +//line messages.qtpl:355 if AuthUser.DisplayDeleteButton { -//line messages.qtpl:333 +//line messages.qtpl:355 qw422016.N().S(` <form method="post" action="/api/v1/chat/messages/delete/`) -//line messages.qtpl:334 +//line messages.qtpl:356 qw422016.E().S(e.UUID) -//line messages.qtpl:334 +//line messages.qtpl:356 qw422016.N().S(`" class="d-inline"> <input type="hidden" name="csrf" value="`) -//line messages.qtpl:335 +//line messages.qtpl:357 qw422016.E().S(CSRF) -//line messages.qtpl:335 +//line messages.qtpl:357 qw422016.N().S(`" /> <button class="mod-btn delete_msg_btn " title="delete" style=" `) -//line messages.qtpl:339 +//line messages.qtpl:361 if string(e.User.Username) != NullUsername { -//line messages.qtpl:340 +//line messages.qtpl:362 if (AuthUser.IsModerator() && e.UserID != AuthUser.ID) || AuthUser.IsAdmin || (e.Room.OwnerUserID != nil && *e.Room.OwnerUserID == AuthUser.ID) { -//line messages.qtpl:340 +//line messages.qtpl:362 qw422016.N().S(` animation: `) -//line messages.qtpl:341 +//line messages.qtpl:363 qw422016.N().DL(e.DeleteSecondsRemaining()) -//line messages.qtpl:341 +//line messages.qtpl:363 qw422016.N().S(`s 1s forwards orange_btn; `) -//line messages.qtpl:342 +//line messages.qtpl:364 } else { -//line messages.qtpl:342 +//line messages.qtpl:364 qw422016.N().S(` animation: `) -//line messages.qtpl:343 +//line messages.qtpl:365 qw422016.N().DL(e.DeleteSecondsRemaining()) -//line messages.qtpl:343 +//line messages.qtpl:365 qw422016.N().S(`s 1s forwards hide_btn; `) -//line messages.qtpl:344 +//line messages.qtpl:366 } -//line messages.qtpl:345 +//line messages.qtpl:367 } -//line messages.qtpl:345 +//line messages.qtpl:367 qw422016.N().S(` " ></button> </form> `) -//line messages.qtpl:349 +//line messages.qtpl:371 } -//line messages.qtpl:350 +//line messages.qtpl:372 } else if (AuthUser.IsModerator() && e.TooOldToDelete() && e.UserID != AuthUser.ID) || AuthUser.IsAdmin || (e.Room.OwnerUserID != nil && *e.Room.OwnerUserID == AuthUser.ID) { -//line messages.qtpl:351 +//line messages.qtpl:373 if AuthUser.DisplayDeleteButton { -//line messages.qtpl:351 +//line messages.qtpl:373 qw422016.N().S(` <form method="post" action="/api/v1/chat/messages/delete/`) -//line messages.qtpl:352 +//line messages.qtpl:374 qw422016.E().S(e.UUID) -//line messages.qtpl:352 +//line messages.qtpl:374 qw422016.N().S(`" class="d-inline"> <input type="hidden" name="csrf" value="`) -//line messages.qtpl:353 +//line messages.qtpl:375 qw422016.E().S(CSRF) -//line messages.qtpl:353 +//line messages.qtpl:375 qw422016.N().S(`" /> <button class="mod-btn delete_msg_btn f-orange-clr" title="delete"></button> </form> `) -//line messages.qtpl:356 +//line messages.qtpl:378 } -//line messages.qtpl:357 +//line messages.qtpl:379 } else if AuthUser.IsModerator() { -//line messages.qtpl:358 +//line messages.qtpl:380 if AuthUser.DisplayDeleteButton { -//line messages.qtpl:358 +//line messages.qtpl:380 qw422016.N().S(` <div class="spacer16"></div> `) -//line messages.qtpl:360 +//line messages.qtpl:382 } -//line messages.qtpl:361 +//line messages.qtpl:383 } else { -//line messages.qtpl:362 +//line messages.qtpl:384 if AuthUser.DisplayDeleteButton { -//line messages.qtpl:362 +//line messages.qtpl:384 qw422016.N().S(` <div class="spacer16"></div> `) -//line messages.qtpl:364 +//line messages.qtpl:386 } -//line messages.qtpl:365 +//line messages.qtpl:387 } -//line messages.qtpl:366 +//line messages.qtpl:388 if AuthUser.IsModerator() { -//line messages.qtpl:367 +//line messages.qtpl:389 if e.UserID != AuthUser.ID { -//line messages.qtpl:368 +//line messages.qtpl:390 if AuthUser.DisplayHellbanButton { -//line messages.qtpl:369 +//line messages.qtpl:391 if string(e.User.Username) == NullUsername { -//line messages.qtpl:369 +//line messages.qtpl:391 qw422016.N().S(` <div class="spacer16"></div> `) -//line messages.qtpl:371 +//line messages.qtpl:393 } else { -//line messages.qtpl:372 +//line messages.qtpl:394 if e.User.IsHellbanned { -//line messages.qtpl:372 +//line messages.qtpl:394 qw422016.N().S(` <form method="post" action="/api/v1/users/`) -//line messages.qtpl:373 +//line messages.qtpl:395 qw422016.E().S(e.UserID.String()) -//line messages.qtpl:373 +//line messages.qtpl:395 qw422016.N().S(`/unhellban" class="d-inline"> <input type="hidden" name="csrf" value="`) -//line messages.qtpl:374 +//line messages.qtpl:396 qw422016.E().S(CSRF) -//line messages.qtpl:374 +//line messages.qtpl:396 qw422016.N().S(`" /> <button class="mod-btn hb_btn f-orange-clr line-through" title="unhellban"></button> </form> `) -//line messages.qtpl:377 +//line messages.qtpl:399 } else { -//line messages.qtpl:377 +//line messages.qtpl:399 qw422016.N().S(` <form method="post" action="/api/v1/users/`) -//line messages.qtpl:378 +//line messages.qtpl:400 qw422016.E().S(e.UserID.String()) -//line messages.qtpl:378 +//line messages.qtpl:400 qw422016.N().S(`/hellban" class="d-inline"> <input type="hidden" name="csrf" value="`) -//line messages.qtpl:379 +//line messages.qtpl:401 qw422016.E().S(CSRF) -//line messages.qtpl:379 +//line messages.qtpl:401 qw422016.N().S(`" /> <button class="mod-btn hb_btn f-orange-clr" title="hellban"></button> </form> `) -//line messages.qtpl:382 +//line messages.qtpl:404 } -//line messages.qtpl:383 +//line messages.qtpl:405 } -//line messages.qtpl:384 +//line messages.qtpl:406 } -//line messages.qtpl:385 +//line messages.qtpl:407 if AuthUser.DisplayKickButton { -//line messages.qtpl:385 +//line messages.qtpl:407 qw422016.N().S(` <form method="post" action="/api/v1/users/`) -//line messages.qtpl:386 +//line messages.qtpl:408 qw422016.E().S(e.UserID.String()) -//line messages.qtpl:386 +//line messages.qtpl:408 qw422016.N().S(`/kick" class="d-inline"> <input type="hidden" name="csrf" value="`) -//line messages.qtpl:387 +//line messages.qtpl:409 qw422016.E().S(CSRF) -//line messages.qtpl:387 +//line messages.qtpl:409 qw422016.N().S(`" /> <button class="mod-btn k_btn f-orange-clr" title="kick"></button> </form> `) -//line messages.qtpl:390 +//line messages.qtpl:412 } -//line messages.qtpl:391 +//line messages.qtpl:413 } else { -//line messages.qtpl:392 +//line messages.qtpl:414 if AuthUser.DisplayKickButton && AuthUser.DisplayHellbanButton { -//line messages.qtpl:392 +//line messages.qtpl:414 qw422016.N().S(` <div class="spacer36"></div> `) -//line messages.qtpl:394 +//line messages.qtpl:416 } else if AuthUser.DisplayKickButton || AuthUser.DisplayHellbanButton { -//line messages.qtpl:394 +//line messages.qtpl:416 qw422016.N().S(` <div class="spacer16"></div> `) -//line messages.qtpl:396 +//line messages.qtpl:418 } -//line messages.qtpl:397 +//line messages.qtpl:419 } -//line messages.qtpl:398 +//line messages.qtpl:420 } -//line messages.qtpl:399 +//line messages.qtpl:421 } else { -//line messages.qtpl:400 +//line messages.qtpl:422 if Data.NbButtons == 3 { -//line messages.qtpl:400 +//line messages.qtpl:422 qw422016.N().S(` <div class="spacer56"></div> `) -//line messages.qtpl:402 +//line messages.qtpl:424 } else if Data.NbButtons == 2 { -//line messages.qtpl:402 +//line messages.qtpl:424 qw422016.N().S(` <div class="spacer36"></div> `) -//line messages.qtpl:404 +//line messages.qtpl:426 } else if Data.NbButtons == 1 { -//line messages.qtpl:404 +//line messages.qtpl:426 qw422016.N().S(` <div class="spacer16"></div> `) -//line messages.qtpl:406 +//line messages.qtpl:428 } -//line messages.qtpl:407 +//line messages.qtpl:429 } -//line messages.qtpl:408 +//line messages.qtpl:430 if AuthUser.GetDateFormat() != "" { -//line messages.qtpl:408 +//line messages.qtpl:430 qw422016.N().S(` <a href="`) -//line messages.qtpl:409 +//line messages.qtpl:431 qw422016.E().S(baseTopBarURL) -//line messages.qtpl:409 +//line messages.qtpl:431 qw422016.N().S(`?quote=`) -//line messages.qtpl:409 +//line messages.qtpl:431 qw422016.E().S(e.UUID) -//line messages.qtpl:409 +//line messages.qtpl:431 streamunesc(qw422016, Data.TopBarQueryParams) -//line messages.qtpl:409 +//line messages.qtpl:431 qw422016.N().S(`" target="iframe1" class="date date-link" title="`) -//line messages.qtpl:409 +//line messages.qtpl:431 qw422016.E().S(e.CreatedAt.Format("01-02 15:04:05")) -//line messages.qtpl:409 +//line messages.qtpl:431 if *isFirstMsg { -//line messages.qtpl:409 +//line messages.qtpl:431 qw422016.N().S(` (`) -//line messages.qtpl:409 +//line messages.qtpl:431 qw422016.E().S(humanize.Time(e.CreatedAt)) -//line messages.qtpl:409 +//line messages.qtpl:431 qw422016.N().S(`)`) -//line messages.qtpl:409 +//line messages.qtpl:431 } -//line messages.qtpl:409 +//line messages.qtpl:431 qw422016.N().S(`">`) -//line messages.qtpl:409 +//line messages.qtpl:431 qw422016.E().S(e.CreatedAt.Format(AuthUser.GetDateFormat())) -//line messages.qtpl:409 +//line messages.qtpl:431 qw422016.N().S(`</a> `) -//line messages.qtpl:410 +//line messages.qtpl:432 *isFirstMsg = false -//line messages.qtpl:410 +//line messages.qtpl:432 qw422016.N().S(` `) -//line messages.qtpl:411 +//line messages.qtpl:433 } -//line messages.qtpl:411 +//line messages.qtpl:433 qw422016.N().S(` <a href="/u/`) -//line messages.qtpl:412 +//line messages.qtpl:434 qw422016.E().S(string(e.GetProfile(AuthUser))) -//line messages.qtpl:412 +//line messages.qtpl:434 qw422016.N().S(`" target="_blank" class="f-def-clr">-</a> `) -//line messages.qtpl:413 +//line messages.qtpl:435 if e.System { -//line messages.qtpl:413 +//line messages.qtpl:435 qw422016.N().S(` <span class="sysmsg">`) -//line messages.qtpl:414 +//line messages.qtpl:436 streamunesc(qw422016, e.Message) -//line messages.qtpl:414 +//line messages.qtpl:436 qw422016.N().S(`</span> `) -//line messages.qtpl:415 +//line messages.qtpl:437 } else { -//line messages.qtpl:416 +//line messages.qtpl:438 if e.Moderators { -//line messages.qtpl:416 +//line messages.qtpl:438 qw422016.N().S(`<span class="sysmsg">[<a href="`) -//line messages.qtpl:416 +//line messages.qtpl:438 qw422016.E().S(baseTopBarURL) -//line messages.qtpl:416 +//line messages.qtpl:438 qw422016.N().S(`?m=1`) -//line messages.qtpl:416 +//line messages.qtpl:438 streamunesc(qw422016, Data.TopBarQueryParams) -//line messages.qtpl:416 +//line messages.qtpl:438 qw422016.N().S(`" target="iframe1" class="sysmsg f-white-clr">M</a>]</span>&nbsp;`) -//line messages.qtpl:416 +//line messages.qtpl:438 } -//line messages.qtpl:417 +//line messages.qtpl:439 if e.GroupID != nil { -//line messages.qtpl:417 +//line messages.qtpl:439 qw422016.N().S(`<span class="sysmsg">[<a href="`) -//line messages.qtpl:417 +//line messages.qtpl:439 qw422016.E().S(baseTopBarURL) -//line messages.qtpl:417 +//line messages.qtpl:439 qw422016.N().S(`?g=`) -//line messages.qtpl:417 +//line messages.qtpl:439 qw422016.E().S(e.Group.Name) -//line messages.qtpl:417 +//line messages.qtpl:439 streamunesc(qw422016, Data.TopBarQueryParams) -//line messages.qtpl:417 +//line messages.qtpl:439 qw422016.N().S(`" target="iframe1" class="sysmsg f-white-clr">`) -//line messages.qtpl:417 +//line messages.qtpl:439 qw422016.E().S(e.Group.Name) -//line messages.qtpl:417 +//line messages.qtpl:439 qw422016.N().S(`</a>]</span>&nbsp;`) -//line messages.qtpl:417 +//line messages.qtpl:439 } -//line messages.qtpl:418 +//line messages.qtpl:440 if e.ToUserID != nil { -//line messages.qtpl:418 +//line messages.qtpl:440 qw422016.N().S(` [`) -//line messages.qtpl:419 +//line messages.qtpl:441 streamfromUsername(qw422016, AuthUser, Data, e, baseTopBarURL) -//line messages.qtpl:419 +//line messages.qtpl:441 qw422016.N().S(` → `) -//line messages.qtpl:421 +//line messages.qtpl:443 if e.ToUser.ID == AuthUser.ID { -//line messages.qtpl:421 +//line messages.qtpl:443 qw422016.N().S(`<span `) -//line messages.qtpl:421 +//line messages.qtpl:443 streamunesc(qw422016, e.ToUser.GenerateChatStyle()) -//line messages.qtpl:421 +//line messages.qtpl:443 qw422016.N().S(`>`) -//line messages.qtpl:421 +//line messages.qtpl:443 qw422016.E().S(string(e.ToUser.Username)) -//line messages.qtpl:421 +//line messages.qtpl:443 qw422016.N().S(`</span>`) -//line messages.qtpl:421 +//line messages.qtpl:443 } else { -//line messages.qtpl:421 +//line messages.qtpl:443 qw422016.N().S(`<a `) -//line messages.qtpl:421 +//line messages.qtpl:443 streamunesc(qw422016, e.ToUser.GenerateChatStyle()) -//line messages.qtpl:421 +//line messages.qtpl:443 qw422016.N().S(` href="`) -//line messages.qtpl:421 +//line messages.qtpl:443 qw422016.E().S(baseTopBarURL) -//line messages.qtpl:421 +//line messages.qtpl:443 qw422016.N().S(`?pm=`) -//line messages.qtpl:421 +//line messages.qtpl:443 qw422016.E().S(string(e.ToUser.Username)) -//line messages.qtpl:421 +//line messages.qtpl:443 qw422016.E().S(Data.TopBarQueryParams) -//line messages.qtpl:421 +//line messages.qtpl:443 qw422016.N().S(`" target="iframe1">`) -//line messages.qtpl:421 +//line messages.qtpl:443 qw422016.E().S(string(e.ToUser.Username)) -//line messages.qtpl:421 +//line messages.qtpl:443 qw422016.N().S(`</a>`) -//line messages.qtpl:421 +//line messages.qtpl:443 } -//line messages.qtpl:421 +//line messages.qtpl:443 qw422016.N().S(`] - `) -//line messages.qtpl:422 +//line messages.qtpl:444 } else { -//line messages.qtpl:423 +//line messages.qtpl:445 streamfromUsername(qw422016, AuthUser, Data, e, baseTopBarURL) -//line messages.qtpl:424 +//line messages.qtpl:446 if !e.IsMe() { -//line messages.qtpl:425 +//line messages.qtpl:447 if AuthUser.CanSeeHB() && (e.IsHellbanned || e.User.IsHellbanned) && (e.ToUserID == nil) { -//line messages.qtpl:425 +//line messages.qtpl:447 qw422016.N().S(` <a href="`) -//line messages.qtpl:426 +//line messages.qtpl:448 qw422016.E().S(baseTopBarURL) -//line messages.qtpl:426 +//line messages.qtpl:448 qw422016.N().S(`?hbm=1`) -//line messages.qtpl:426 +//line messages.qtpl:448 streamunesc(qw422016, Data.TopBarQueryParams) -//line messages.qtpl:426 +//line messages.qtpl:448 qw422016.N().S(`" target="iframe1" class="f-def-clr">-</a> `) -//line messages.qtpl:427 +//line messages.qtpl:449 } else { -//line messages.qtpl:427 +//line messages.qtpl:449 qw422016.N().S(` - `) -//line messages.qtpl:429 +//line messages.qtpl:451 } -//line messages.qtpl:430 +//line messages.qtpl:452 } -//line messages.qtpl:431 +//line messages.qtpl:453 } -//line messages.qtpl:431 +//line messages.qtpl:453 qw422016.N().S(` <span `) -//line messages.qtpl:432 +//line messages.qtpl:454 streamunesc(qw422016, e.User.GenerateChatStyle()) -//line messages.qtpl:432 +//line messages.qtpl:454 qw422016.N().S(`><span class="o-wrap">`) -//line messages.qtpl:432 +//line messages.qtpl:454 qw422016.N().S(unesc(e.MsgToDisplay())) -//line messages.qtpl:432 +//line messages.qtpl:454 qw422016.N().S(`</span></span> `) -//line messages.qtpl:433 +//line messages.qtpl:455 } -//line messages.qtpl:433 +//line messages.qtpl:455 qw422016.N().S(` </div> `) -//line messages.qtpl:435 +//line messages.qtpl:457 } -//line messages.qtpl:436 +//line messages.qtpl:458 } -//line messages.qtpl:436 +//line messages.qtpl:458 func WriteRenderMessage(qq422016 qtio422016.Writer, idx int, e database.ChatMessage, AuthUser *database.User, Data ChatMessagesData, baseTopBarURL string, readMarkerRendered, isFirstMsg *bool, CSRF, NullUsername string) { -//line messages.qtpl:436 +//line messages.qtpl:458 qw422016 := qt422016.AcquireWriter(qq422016) -//line messages.qtpl:436 +//line messages.qtpl:458 StreamRenderMessage(qw422016, idx, e, AuthUser, Data, baseTopBarURL, readMarkerRendered, isFirstMsg, CSRF, NullUsername) -//line messages.qtpl:436 +//line messages.qtpl:458 qt422016.ReleaseWriter(qw422016) -//line messages.qtpl:436 +//line messages.qtpl:458 } -//line messages.qtpl:436 +//line messages.qtpl:458 func RenderMessage(idx int, e database.ChatMessage, AuthUser *database.User, Data ChatMessagesData, baseTopBarURL string, readMarkerRendered, isFirstMsg *bool, CSRF, NullUsername string) string { -//line messages.qtpl:436 +//line messages.qtpl:458 qb422016 := qt422016.AcquireByteBuffer() -//line messages.qtpl:436 +//line messages.qtpl:458 WriteRenderMessage(qb422016, idx, e, AuthUser, Data, baseTopBarURL, readMarkerRendered, isFirstMsg, CSRF, NullUsername) -//line messages.qtpl:436 +//line messages.qtpl:458 qs422016 := string(qb422016.B) -//line messages.qtpl:436 +//line messages.qtpl:458 qt422016.ReleaseByteBuffer(qb422016) -//line messages.qtpl:436 +//line messages.qtpl:458 return qs422016 -//line messages.qtpl:436 +//line messages.qtpl:458 } -//line messages.qtpl:439 +//line messages.qtpl:461 func StreamMember(qw422016 *qt422016.Writer, AuthUser *database.User, Data ChatMenuData, El managers.UserInfo) { -//line messages.qtpl:439 +//line messages.qtpl:461 qw422016.N().S(` `) -//line messages.qtpl:440 +//line messages.qtpl:462 baseTopBarURL := "/api/v1/chat/top-bar/" + Data.RoomName -//line messages.qtpl:441 +//line messages.qtpl:463 if El.Username == AuthUser.Username { -//line messages.qtpl:441 +//line messages.qtpl:463 qw422016.N().S(` <div> <span style="color: `) -//line messages.qtpl:443 +//line messages.qtpl:465 qw422016.E().S(El.Color) -//line messages.qtpl:443 +//line messages.qtpl:465 qw422016.N().S(`;">`) -//line messages.qtpl:443 +//line messages.qtpl:465 qw422016.E().S(string(El.Username)) -//line messages.qtpl:443 +//line messages.qtpl:465 qw422016.N().S(`</span> `) -//line messages.qtpl:444 +//line messages.qtpl:466 if El.AfkIndicatorEnabled { -//line messages.qtpl:444 +//line messages.qtpl:466 qw422016.N().S(` <small class="afk-indicator">afk</small> `) -//line messages.qtpl:446 +//line messages.qtpl:468 } -//line messages.qtpl:446 +//line messages.qtpl:468 qw422016.N().S(` </div> `) -//line messages.qtpl:448 +//line messages.qtpl:470 } else { -//line messages.qtpl:449 +//line messages.qtpl:471 if !El.IsHellbanned || AuthUser.ID == El.UserID || (El.IsHellbanned && AuthUser.IsHellbanned) || AuthUser.DisplayHellbanned { -//line messages.qtpl:449 +//line messages.qtpl:471 qw422016.N().S(` <div> `) -//line messages.qtpl:451 +//line messages.qtpl:473 tagType := "tag" -//line messages.qtpl:452 +//line messages.qtpl:474 if AuthUser.CanSeeHB() && El.IsHellbanned { -//line messages.qtpl:453 +//line messages.qtpl:475 tagType = "htag" -//line messages.qtpl:454 +//line messages.qtpl:476 } -//line messages.qtpl:455 +//line messages.qtpl:477 qw422016.N().S(`<a href="`) -//line messages.qtpl:456 +//line messages.qtpl:478 qw422016.E().S(baseTopBarURL) -//line messages.qtpl:456 +//line messages.qtpl:478 qw422016.N().S(`?`) -//line messages.qtpl:456 +//line messages.qtpl:478 qw422016.E().S(tagType) -//line messages.qtpl:456 +//line messages.qtpl:478 qw422016.N().S(`=`) -//line messages.qtpl:456 +//line messages.qtpl:478 qw422016.E().S(string(El.Username)) -//line messages.qtpl:456 +//line messages.qtpl:478 streamunesc(qw422016, Data.TopBarQueryParams) -//line messages.qtpl:456 +//line messages.qtpl:478 qw422016.N().S(`"target="iframe1"`) -//line messages.qtpl:458 +//line messages.qtpl:480 if El.IsHellbanned && AuthUser.DisplayHellbanned { -//line messages.qtpl:458 +//line messages.qtpl:480 qw422016.N().S(`class="hb-row"`) -//line messages.qtpl:458 +//line messages.qtpl:480 } -//line messages.qtpl:458 +//line messages.qtpl:480 qw422016.N().S(`style="color:`) -//line messages.qtpl:459 +//line messages.qtpl:481 qw422016.E().S(El.Color) -//line messages.qtpl:459 +//line messages.qtpl:481 qw422016.N().S(`;">`) -//line messages.qtpl:459 +//line messages.qtpl:481 qw422016.E().S(string(El.Username[0])) -//line messages.qtpl:459 +//line messages.qtpl:481 qw422016.N().S(`</a><a href="`) -//line messages.qtpl:460 +//line messages.qtpl:482 qw422016.E().S(baseTopBarURL) -//line messages.qtpl:460 +//line messages.qtpl:482 qw422016.N().S(`?pm=`) -//line messages.qtpl:460 +//line messages.qtpl:482 qw422016.E().S(string(El.Username)) -//line messages.qtpl:460 +//line messages.qtpl:482 streamunesc(qw422016, Data.TopBarQueryParams) -//line messages.qtpl:460 +//line messages.qtpl:482 qw422016.N().S(`"target="iframe1"`) -//line messages.qtpl:462 +//line messages.qtpl:484 if El.IsHellbanned && AuthUser.DisplayHellbanned { -//line messages.qtpl:462 +//line messages.qtpl:484 qw422016.N().S(`class="hb-row"`) -//line messages.qtpl:462 +//line messages.qtpl:484 } -//line messages.qtpl:462 +//line messages.qtpl:484 qw422016.N().S(`style="color:`) -//line messages.qtpl:463 +//line messages.qtpl:485 qw422016.E().S(El.Color) -//line messages.qtpl:463 +//line messages.qtpl:485 qw422016.N().S(`;">`) -//line messages.qtpl:463 +//line messages.qtpl:485 qw422016.E().S(string(El.Username[1 : len(El.Username)-1])) -//line messages.qtpl:463 +//line messages.qtpl:485 qw422016.N().S(`</a><a href="/u/`) -//line messages.qtpl:464 +//line messages.qtpl:486 qw422016.E().S(string(El.Username)) -//line messages.qtpl:464 +//line messages.qtpl:486 qw422016.N().S(`"rel="noopener noreferrer" target="_blank"`) -//line messages.qtpl:466 +//line messages.qtpl:488 if El.IsHellbanned && AuthUser.DisplayHellbanned { -//line messages.qtpl:466 +//line messages.qtpl:488 qw422016.N().S(`class="hb-row"`) -//line messages.qtpl:466 +//line messages.qtpl:488 } -//line messages.qtpl:466 +//line messages.qtpl:488 qw422016.N().S(`style="color:`) -//line messages.qtpl:467 +//line messages.qtpl:489 qw422016.E().S(El.Color) -//line messages.qtpl:467 +//line messages.qtpl:489 qw422016.N().S(`;">`) -//line messages.qtpl:467 +//line messages.qtpl:489 qw422016.E().S(string(El.Username[len(El.Username)-1])) -//line messages.qtpl:467 +//line messages.qtpl:489 qw422016.N().S(`</a>`) -//line messages.qtpl:469 +//line messages.qtpl:491 if El.AfkIndicatorEnabled { -//line messages.qtpl:469 +//line messages.qtpl:491 qw422016.N().S(` <small class="afk-indicator">afk</small> `) -//line messages.qtpl:471 +//line messages.qtpl:493 } -//line messages.qtpl:471 +//line messages.qtpl:493 qw422016.N().S(` </div> `) -//line messages.qtpl:473 +//line messages.qtpl:495 } -//line messages.qtpl:474 +//line messages.qtpl:496 } -//line messages.qtpl:475 +//line messages.qtpl:497 } -//line messages.qtpl:475 +//line messages.qtpl:497 func WriteMember(qq422016 qtio422016.Writer, AuthUser *database.User, Data ChatMenuData, El managers.UserInfo) { -//line messages.qtpl:475 +//line messages.qtpl:497 qw422016 := qt422016.AcquireWriter(qq422016) -//line messages.qtpl:475 +//line messages.qtpl:497 StreamMember(qw422016, AuthUser, Data, El) -//line messages.qtpl:475 +//line messages.qtpl:497 qt422016.ReleaseWriter(qw422016) -//line messages.qtpl:475 +//line messages.qtpl:497 } -//line messages.qtpl:475 +//line messages.qtpl:497 func Member(AuthUser *database.User, Data ChatMenuData, El managers.UserInfo) string { -//line messages.qtpl:475 +//line messages.qtpl:497 qb422016 := qt422016.AcquireByteBuffer() -//line messages.qtpl:475 +//line messages.qtpl:497 WriteMember(qb422016, AuthUser, Data, El) -//line messages.qtpl:475 +//line messages.qtpl:497 qs422016 := string(qb422016.B) -//line messages.qtpl:475 +//line messages.qtpl:497 qt422016.ReleaseByteBuffer(qb422016) -//line messages.qtpl:475 +//line messages.qtpl:497 return qs422016 -//line messages.qtpl:475 +//line messages.qtpl:497 } -//line messages.qtpl:478 +//line messages.qtpl:500 func streamfromUsername(qw422016 *qt422016.Writer, AuthUser *database.User, Data ChatMessagesData, El database.ChatMessage, baseTopBarURL string) { -//line messages.qtpl:479 +//line messages.qtpl:501 tagType := "tag" -//line messages.qtpl:480 +//line messages.qtpl:502 if El.ToUserID != nil { -//line messages.qtpl:481 +//line messages.qtpl:503 tagType = "pm" -//line messages.qtpl:482 +//line messages.qtpl:504 } else if AuthUser.CanSeeHB() && (El.IsHellbanned || El.User.IsHellbanned) { -//line messages.qtpl:483 +//line messages.qtpl:505 tagType = "htag" -//line messages.qtpl:484 +//line messages.qtpl:506 } else if AuthUser.IsModerator() && El.Moderators { -//line messages.qtpl:485 +//line messages.qtpl:507 tagType = "mtag" -//line messages.qtpl:486 +//line messages.qtpl:508 } -//line messages.qtpl:487 +//line messages.qtpl:509 if El.User.ID == AuthUser.ID { -//line messages.qtpl:488 +//line messages.qtpl:510 if El.CanBeEdited() { -//line messages.qtpl:488 +//line messages.qtpl:510 qw422016.N().S(`<a `) -//line messages.qtpl:488 +//line messages.qtpl:510 streamunesc(qw422016, El.User.GenerateChatStyle()) -//line messages.qtpl:488 +//line messages.qtpl:510 qw422016.N().S(` href="`) -//line messages.qtpl:488 +//line messages.qtpl:510 qw422016.E().S(baseTopBarURL) -//line messages.qtpl:488 +//line messages.qtpl:510 qw422016.N().S(`?e=`) -//line messages.qtpl:488 +//line messages.qtpl:510 qw422016.E().S(El.CreatedAt.Format("15:04:05")) -//line messages.qtpl:488 +//line messages.qtpl:510 streamunesc(qw422016, Data.TopBarQueryParams) -//line messages.qtpl:488 +//line messages.qtpl:510 qw422016.N().S(`" target="iframe1">`) -//line messages.qtpl:488 +//line messages.qtpl:510 qw422016.E().S(string(El.User.Username)) -//line messages.qtpl:488 +//line messages.qtpl:510 qw422016.N().S(`</a>`) -//line messages.qtpl:488 +//line messages.qtpl:510 } else { -//line messages.qtpl:488 +//line messages.qtpl:510 qw422016.N().S(`<span `) -//line messages.qtpl:488 +//line messages.qtpl:510 streamunesc(qw422016, El.User.GenerateChatStyle()) -//line messages.qtpl:488 +//line messages.qtpl:510 qw422016.N().S(`>`) -//line messages.qtpl:488 +//line messages.qtpl:510 qw422016.E().S(string(El.User.Username)) -//line messages.qtpl:488 +//line messages.qtpl:510 qw422016.N().S(`</span>`) -//line messages.qtpl:488 +//line messages.qtpl:510 } -//line messages.qtpl:489 +//line messages.qtpl:511 } else { -//line messages.qtpl:489 +//line messages.qtpl:511 qw422016.N().S(`<a `) -//line messages.qtpl:489 +//line messages.qtpl:511 streamunesc(qw422016, El.User.GenerateChatStyle()) -//line messages.qtpl:489 +//line messages.qtpl:511 qw422016.N().S(` href="`) -//line messages.qtpl:489 +//line messages.qtpl:511 qw422016.E().S(baseTopBarURL) -//line messages.qtpl:489 +//line messages.qtpl:511 qw422016.N().S(`?`) -//line messages.qtpl:489 +//line messages.qtpl:511 qw422016.E().S(tagType) -//line messages.qtpl:489 +//line messages.qtpl:511 qw422016.N().S(`=`) -//line messages.qtpl:489 +//line messages.qtpl:511 qw422016.E().S(string(El.User.Username)) -//line messages.qtpl:489 +//line messages.qtpl:511 streamunesc(qw422016, Data.TopBarQueryParams) -//line messages.qtpl:489 +//line messages.qtpl:511 qw422016.N().S(`" target="iframe1">`) -//line messages.qtpl:489 +//line messages.qtpl:511 qw422016.E().S(string(El.User.Username)) -//line messages.qtpl:489 +//line messages.qtpl:511 qw422016.N().S(`</a>`) -//line messages.qtpl:489 +//line messages.qtpl:511 } -//line messages.qtpl:490 +//line messages.qtpl:512 } -//line messages.qtpl:490 +//line messages.qtpl:512 func writefromUsername(qq422016 qtio422016.Writer, AuthUser *database.User, Data ChatMessagesData, El database.ChatMessage, baseTopBarURL string) { -//line messages.qtpl:490 +//line messages.qtpl:512 qw422016 := qt422016.AcquireWriter(qq422016) -//line messages.qtpl:490 +//line messages.qtpl:512 streamfromUsername(qw422016, AuthUser, Data, El, baseTopBarURL) -//line messages.qtpl:490 +//line messages.qtpl:512 qt422016.ReleaseWriter(qw422016) -//line messages.qtpl:490 +//line messages.qtpl:512 } -//line messages.qtpl:490 +//line messages.qtpl:512 func fromUsername(AuthUser *database.User, Data ChatMessagesData, El database.ChatMessage, baseTopBarURL string) string { -//line messages.qtpl:490 +//line messages.qtpl:512 qb422016 := qt422016.AcquireByteBuffer() -//line messages.qtpl:490 +//line messages.qtpl:512 writefromUsername(qb422016, AuthUser, Data, El, baseTopBarURL) -//line messages.qtpl:490 +//line messages.qtpl:512 qs422016 := string(qb422016.B) -//line messages.qtpl:490 +//line messages.qtpl:512 qt422016.ReleaseByteBuffer(qb422016) -//line messages.qtpl:490 +//line messages.qtpl:512 return qs422016 -//line messages.qtpl:490 +//line messages.qtpl:512 } diff --git a/pkg/web/handlers/api/v1/slashInterceptor.go b/pkg/web/handlers/api/v1/slashInterceptor.go @@ -91,6 +91,7 @@ func handleUserCmd(c *Command) (handled bool) { handleAfkCmd(c) || handleDateCmd(c) || handleUpdateReadMarkerCmd(c) || + handleCodeCmd(c) || handleErrorCmd(c) } @@ -1758,6 +1759,19 @@ func handleRefreshCmd(c *Command) (handled bool) { return } +func handleCodeCmd(c *Command) (handled bool) { + if c.message == "/code" { + c.err = ErrRedirect + if !c.authUser.CanUseMultiline { + c.err = errors.New("multiline is disabled for your account") + return true + } + database.MsgPubSub.Pub("code_show_"+c.authUser.ID.String()+"_"+c.room.ID.String(), database.ChatMessageType{}) + return true + } + return +} + func handleUpdateReadMarkerCmd(c *Command) (handled bool) { if c.message == "/r" { c.db.UpdateChatReadMarker(c.authUser.ID, c.room.ID) diff --git a/pkg/web/handlers/api/v1/topBarHandler.go b/pkg/web/handlers/api/v1/topBarHandler.go @@ -269,6 +269,23 @@ func ChatTopBarHandler(c echo.Context) error { origMessage := strings.TrimSpace(c.Request().PostFormValue("message")) + if authUser.CanUseMultiline && c.Request().PostFormValue("sender") == "codeModal" { + database.MsgPubSub.Pub("code_hide_"+authUser.ID.String()+"_"+room.ID.String(), database.ChatMessageType{}) + lang := c.Request().PostFormValue("lang") + if !utils.InArr(lang, []string{"go", "c", "cpp", "py", "js"}) { + lang = "" + } + origMessage = "\n```" + lang + "\n" + origMessage + "\n```\n" + cmd := NewCommand(c, origMessage, room, roomKey) + cmd.redirectQP = redirectQP + MsgInterceptor{}.InterceptMsg(cmd) + data.Message = cmd.dataMessage + if cmd.err != nil { + return handleCmdError(cmd.err, c, data, cmd.redirectURL(), cmd.origMessage) + } + return c.Redirect(http.StatusFound, cmd.redirectURL()) + } + cmd := NewCommand(c, origMessage, room, roomKey) cmd.redirectQP = redirectQP diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go @@ -5147,10 +5147,14 @@ func ChatStreamMessagesHandler(c echo.Context) error { c.Response().Flush() // Create a subscriber and topics to listen to + selfCodeShowTopic := "code_show_" + authUser.ID.String() + "_" + room.ID.String() + selfCodeHideTopic := "code_hide_" + authUser.ID.String() + "_" + room.ID.String() selfRefreshTopic := "refresh_" + string(authUser.Username) readMarkerTopic := "readmarker_" + authUser.ID.String() authorizedTopics := []string{ "refresh", + selfCodeShowTopic, + selfCodeHideTopic, selfRefreshTopic, readMarkerTopic, "room_" + room.ID.String()} @@ -5197,6 +5201,8 @@ func ChatStreamMessagesHandler(c echo.Context) error { // We need to change the css class in order for the css to never actually complete the animation and stay "green". var indicatorSelector bool + var codeModalIdx int + Loop: for { select { @@ -5246,6 +5252,36 @@ Loop: return nil } + if topic == selfCodeShowTopic { + send(`<style>.code-modal{display:block;}</style>`) + send(`<div class="code-modal code-modal-` + strconv.Itoa(codeModalIdx) + `"> +<form method="post" target="iframe1" action="/api/v1/chat/top-bar/` + roomName + `"> + <input type="hidden" name="csrf" value="` + csrf + `" /> + <input type="hidden" name="sender" value="codeModal" /> + <textarea name="message" placeholder="Paste your code here..."></textarea> + <div class="controls"> + <select name="lang"> + <option value="">Raw text</option> + <option value="go">Golang</option> + <option value="cpp">C++</option> + <option value="c">C</option> + <option value="py">Python</option> + <option value="js">Javascript</option> + </select> + <button type="submit">send</button> + </div> +</form> +</div>`) + c.Response().Flush() + continue + } + if topic == selfCodeHideTopic { + send(`<style>.code-modal-` + strconv.Itoa(codeModalIdx) + `{display:none !important;}</style>`) + codeModalIdx++ + c.Response().Flush() + continue + } + if msgTyp.Typ == database.DeleteMsg { // Delete msg from the map that keep track of unread messages. // If the map is now empty, we hide the read-marker.