diff --git a/init/init.go b/init/init.go index 85d2f92..0705439 100644 --- a/init/init.go +++ b/init/init.go @@ -1,7 +1,9 @@ package init import ( + "math/rand" "os" + "time" "fornaxian.com/pixeldrain-web/webcontroller" "github.com/Fornaxian/config" @@ -34,6 +36,9 @@ maintenance_mode = false func Init(r *httprouter.Router, prefix string, setLogLevel bool) { log.Info("Starting web UI server (PID %v)", os.Getpid()) + // Seed the RNG + rand.Seed(time.Now().UnixNano()) + var webconf = &PixelWebConfig{} var _, err = config.New( DefaultConfig, diff --git a/res/include/script/file_viewer/Viewer.js b/res/include/script/file_viewer/Viewer.js index 08f26f0..7b868c5 100644 --- a/res/include/script/file_viewer/Viewer.js +++ b/res/include/script/file_viewer/Viewer.js @@ -50,8 +50,8 @@ function Viewer(type, viewToken, data) { this.setFile(fileFromSkyNet(data)) } - this.renderSponsorsSimple() - window.addEventListener("resize", e => { this.renderSponsorsSimple() }) + this.renderSponsors() + window.addEventListener("resize", e => { this.renderSponsors() }) // Register keyboard shortcuts document.addEventListener("keydown", e => { this.keyboardEvent(e) }) @@ -132,12 +132,12 @@ Viewer.prototype.setFile = function(file) { } } -Viewer.prototype.renderSponsorsSimple = function() { +Viewer.prototype.renderSponsors = function() { let scaleWidth = 1 let scaleHeight = 1 - let minWindowHeight = 1000 - let bannerWidth = 720 - let bannerHeight = 120 + let minWindowHeight = 800 + let bannerWidth = document.querySelector(".sponsors_banner").offsetWidth + let bannerHeight = document.querySelector(".sponsors_banner").offsetHeight if (window.innerWidth < bannerWidth) { scaleWidth = window.innerWidth/bannerWidth @@ -146,45 +146,21 @@ Viewer.prototype.renderSponsorsSimple = function() { scaleHeight = window.innerHeight/minWindowHeight } + // The smaller scale is the scale we'll use let scale = scaleWidth < scaleHeight ? scaleWidth : scaleHeight - document.querySelector(".sponsors").style.height = (scale*bannerHeight)+"px" + + // Because of the scale transformation the automatic margins don't work + // anymore. So we have to manually calculate the margin. Here we take the + // width of the viewport - the width of the ad to calculate the amount of + // pixels around the ad. We multiply the ad size by the scale we calcualted + // to account for the smaller size. + let offset = (window.innerWidth - (bannerWidth*scale)) / 2 + + document.querySelector(".sponsors").style.height = (bannerHeight*scale)+"px" + document.querySelector(".sponsors_banner").style.marginLeft = offset+"px" + document.querySelector(".sponsors_banner").style.transform = "scale("+scale+")" } -// Viewer.prototype.renderSponsors = function() { -// let scale = 1 -// let scaleWidth = 1 -// let scaleHeight = 1 -// let minWidth = 728 -// let minHeight = 800 - -// if (window.innerWidth < minWidth) { -// scaleWidth = window.innerWidth/minWidth -// } -// if (window.innerHeight < minHeight) { -// scaleHeight = window.innerHeight/minHeight -// } -// scale = scaleWidth < scaleHeight ? scaleWidth : scaleHeight - -// // Because of the scale transformation the automatic margins don't work -// // anymore. So we have to maunally calculate the margin. Where we take the -// // width of the viewport - the width of the ad to calculate the amount of -// // pixels around the ad. We multiply the ad size by the scale we calcualted -// // to account for the smaller size. -// let offset = (window.innerWidth - (minWidth*scale)) / 2 -// if (offset < 0) { -// offset = 0 -// } -// document.querySelector(".sponsors > iframe").style.marginLeft = offset+"px" - -// if (scale == 1) { -// document.querySelector(".sponsors > iframe").style.transform = "none" -// document.querySelector(".sponsors").style.height = "90px" -// } else { -// document.querySelector(".sponsors > iframe").style.transform = "scale("+scale+")" -// document.querySelector(".sponsors").style.height = (scale*90)+"px" -// } -// } - Viewer.prototype.keyboardEvent = function(evt) { if (evt.ctrlKey || evt.altKey || evt.metaKey) { return // prevent custom shortcuts from interfering with system shortcuts diff --git a/res/include/style/viewer.css b/res/include/style/viewer.css index 8061056..f391496 100644 --- a/res/include/style/viewer.css +++ b/res/include/style/viewer.css @@ -116,7 +116,7 @@ font-size: 0; line-height: 0; } -.file_viewer > .sponsors > iframe { +.file_viewer > .sponsors > * { display: block; margin: auto; transform-origin: 0 0; diff --git a/res/template/file_viewer.html b/res/template/file_viewer.html index bf6f6b8..a009aeb 100644 --- a/res/template/file_viewer.html +++ b/res/template/file_viewer.html @@ -100,9 +100,19 @@
diff --git a/webcontroller/file_viewer.go b/webcontroller/file_viewer.go index 27ce153..24c146f 100644 --- a/webcontroller/file_viewer.go +++ b/webcontroller/file_viewer.go @@ -3,6 +3,7 @@ package webcontroller import ( "fmt" "io/ioutil" + "math/rand" "mime" "net/http" "strconv" @@ -28,10 +29,25 @@ func browserCompat(ua string) bool { return strings.Contains(ua, "MSIE") || strings.Contains(ua, "Trident/7.0") } +func adType() (i int) { + // Intn returns a number up to n, but never n itself. So it get a random 0 + // or 1 we need to give it n=2. We can use this function to make other + // splits like 1/3 1/4, etc + i = rand.Intn(2) + + switch { + case i == 1: // 50% of the traffic + return 1 // Amarula + default: + return 0 // A-Ads + } +} + type viewerData struct { Type string // file or list CaptchaKey string ViewToken string + AdType int APIResponse interface{} } @@ -69,6 +85,7 @@ func (wc *WebController) serveFileViewer(w http.ResponseWriter, r *http.Request, Type: "list", CaptchaKey: wc.captchaKey(), ViewToken: wc.viewTokenOrBust(), + AdType: adType(), APIResponse: pixelapi.List{ Success: true, Title: "Multiple files", @@ -82,6 +99,7 @@ func (wc *WebController) serveFileViewer(w http.ResponseWriter, r *http.Request, Type: "file", CaptchaKey: wc.captchaKey(), ViewToken: wc.viewTokenOrBust(), + AdType: adType(), APIResponse: finfo[0].FileInfo, } } @@ -105,6 +123,7 @@ func (wc *WebController) serveFileViewerDemo(w http.ResponseWriter, r *http.Requ templateData.Other = viewerData{ Type: "file", CaptchaKey: wc.captchaSiteKey, + AdType: 0, // Always show a-ads on the demo page APIResponse: map[string]interface{}{ "id": "demo", "name": "Demo file", @@ -147,6 +166,7 @@ func (wc *WebController) serveListViewer(w http.ResponseWriter, r *http.Request, Type: "list", CaptchaKey: wc.captchaSiteKey, ViewToken: wc.viewTokenOrBust(), + AdType: adType(), APIResponse: list, } @@ -235,7 +255,8 @@ func (wc *WebController) serveSkynetViewer(w http.ResponseWriter, r *http.Reques templateData.OGData = "" templateData.Title = fmt.Sprintf("name ~ Skynet") templateData.Other = viewerData{ - Type: "skylink", + Type: "skylink", + AdType: adType(), APIResponse: pixelapi.FileInfo{ Success: true, ID: p.ByName("id"),