library(shiny)
library(RODBC)
# Copied from https://github.com/szilard/shinyvalidinp/blob/master/R/shinyvalidinp.R
# Fixed by Security XIII to work on Linux
validinp_character <- function(x, pattern="^[[:alnum:]. _-]*$", many=FALSE) {
if(many && is.null(x)) return(character(0)) ## hack for checkboxGroupInput
if(!( is.character(x) && (many || length(x)==1) &&
all(!is.na(x)) && all(grepl(pattern,x)) )) {
stop("Illegal characters in the user name")
}
x
}
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("Golos - check current post bandwidth"),
# Sidebar with a slider input for number of bins
verticalLayout(
textInput("name",
"User name:",
width = '200px'),
actionButton("goButton", "Go!"),
# TODO make submit on Enter https://github.com/daattali/advanced-shiny/blob/master/proxy-click/app.R
textOutput("message"),
HTML("
This app is developed by @oxygendependant and is using GolosSQL server, thanks to @arcange.
Source code at github")
)
)
# Define server logic required to draw a histogram
server <- function(input, output) {
output$message<-renderText({
name<-validinp_character(input$name)
if (input$goButton == 0)
return()
msg<-isolate({
dbhandle <- odbcDriverConnect('Driver=FreeTDS;TDS_Version=7.0;Server=sql.golos.cloud;Port=1433;Uid=golos;Pwd=golos')
# TODO Need a check if the username exists at all (and there wasn't a typo)
last.created <- sqlQuery(dbhandle,
paste0('SELECT Top 1 created FROM Comments WHERE depth=0
AND author=\'', name, '\'
ORDER BY Created DESC'))[[1]]
last.created <- sqlQuery(dbhandle,
paste0('SELECT Top 1 created FROM Comments WHERE depth=0
AND author=\'', name, '\'
ORDER BY Created DESC'))[[1]]
in30min <- sqlQuery(dbhandle,
paste0('SELECT COUNT(*) FROM Comments WHERE depth=0
AND author=\'', name, '\'
AND created >= DateAdd(mi, -30, GETUTCDATE())'))[[1]]
last.bandw <- sqlQuery(dbhandle,
paste0('SELECT Top 1 post_bandwidth FROM Accounts
WHERE name=\'', name, '\''))[[1]]
orig.time <- Sys.time()
gmttime <- function(x) as.character(as.POSIXlt(x, tz="GMT"))
curtime <- gmttime(orig.time)
passed <- as.integer(difftime(curtime, last.created, units="secs"))
bandw <- round(last.bandw * (1 - min(passed, 86400) / 86400))
acceptable.age <- round(86400 - 2592000000 / max(last.bandw, 30000))
# 2592000000 = 30k * (60 * 60 * 24)
extra.bandw <- max(bandw - 30000, 0)
msg<-paste0("Currently consumed bandwidth is ",
bandw,
" (be sure that GolosSQL has catched up on the latest ones - it knows of ",
in30min,
" posts from the last 30 minutes).",
if(extra.bandw > 0) {
remaining_time_min <- (acceptable.age - passed) / 60
penalty <- round(100 * (1 - (40000 / (bandw + 10000)) ^ 2))
paste0(" Remaining time is ",
remaining_time_min%/%60,
" hours ",
round(remaining_time_min%%60),
" minutes. If you were to post right now, penalty would be ",
penalty,
"%.")
}
else
". It's ok to post now."
)
odbcClose(dbhandle)
return(msg)
})
})
}
# Run the application
shinyApp(ui = ui, server = server)
# For debug
# sqlQuery(dbhandle, 'SELECT top 1 url FROM Comments WHERE reward_weight < 10000 ORDER BY Created DESC'