added hebrew, statistics

This commit is contained in:
2024-06-09 15:44:01 +03:00
parent 8a3782e1db
commit 409b076cd0
7 changed files with 198 additions and 57 deletions

View File

@@ -3,11 +3,12 @@
<html> <html>
<head> <head>
{{if eq .Lang "heb"}}<link href="/public/hebrew.css" rel="stylesheet" type="text/css">{{end}}
<title>{{ .ElementsData.Title }}</title> <title>{{ .ElementsData.Title }}</title>
<link href="/public/mod.css" rel="stylesheet" type="text/css"> <link href="/public/mod.css" rel="stylesheet" type="text/css">
<script src="/public/script.js"></script> <script src="/public/script.js"></script>
</head> </head>
<body> <body {{if eq .BodyClass "m"}} class="m"{{end}}>
{{template "body" .}} {{template "body" .}}
</body> </body>
</html> </html>

49
html/statsitics.html Normal file
View File

@@ -0,0 +1,49 @@
{{define "body"}}
<div class="container">
<div class="column">
<h1>Download Statistics</h1>
<table>
<tr>
<th>Program</th>
<th>Version</th>
<th>Download Count</th>
</tr>
{{range .VersionStats}}
<tr>
<td>
{{.ID}}
</td>
<td>
{{.Version}}
</td>
<td>
{{.Counter}}
</td>
</tr>
{{end}}
</table>
</div>
<div class="column" id="totalus">
<h1>Total Download Statistics</h1>
<table>
<tr>
<th>Package</th>
<th>Search Count</th>
</tr>
{{range .TotalStats}}
<tr>
<td>
{{.ID}}
</td>
<td>
{{.Counter}}
</td>
</tr>
{{end}}
</table>
</div>
</div>
{{end}}

View File

@@ -1,13 +1,37 @@
<!DOCTYPE html> {{define "body"}}
<html lang="en">
<head> <div class="form-container">
<meta charset="UTF-8"> <form>
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <div class="form-group">
<title>File Upload</title> <label for="PackageIdentifier">PackageIdentifier</label>
<link href="mod.css" rel="stylesheet" type="text/css"> <input type="text" id="PackageIdentifier" name="PackageIdentifier" value="<%= frm.identifier %>">
<script src="script.js"></script> </div>
</head> <div class="form-group">
<body> <label for="PackageVersion">PackageVersion</label>
<input type="text" id="PackageVersion" name="PackageVersion" value="<%= frm.version %>">
</div>
<div class="form-group">
<label for="InstallerType">InstallerType</label>
<input type="text" id="InstallerType" name="InstallerType" value="<%= frm.type %>">
</div>
<fieldset>
<legend>Installers</legend>
<div class="form-group">
<label for="InstallerUrl">InstallerUrl</label>
<input type="url" id="InstallerUrl" name="InstallerUrl" value="<%= frm.url %>">
</div>
<div class="form-group">
<label for="InstallerSha256">InstallerSha256</label>
<input type="text" id="InstallerSha256" name="InstallerSha256" value="<%= frm.checksum %>">
</div>
</fieldset>
<div class="form-group">
<label for="Dependencies">Dependencies</label>
<input type="text" id="Dependencies" name="Dependencies">
</div>
<input type="submit" value="Submit">
</form>
</div>
<!-- <div> --> <!-- <div> -->
<form action="/upload" method="post" enctype="multipart/form-data"> <form action="/upload" method="post" enctype="multipart/form-data">
@@ -29,5 +53,4 @@
} }
}); });
</script> </script>
</body> {{end}}
</html>

131
main.go
View File

@@ -32,7 +32,7 @@ func simpRequestResp(res http.ResponseWriter, req *http.Request) {
func getMsgFromDB(sqldb *sql.DB, id string, lang string) string { func getMsgFromDB(sqldb *sql.DB, id string, lang string) string {
var lngs []string var lngs []string
lngs = append(lngs, lang) lngs = append(lngs, lang)
query := generateSQL("msgs",lngs,[2]string{"content", id}) query := generateSQL("msgs", lngs, [2]string{"content", id})
res := sqldb.QueryRow(query) res := sqldb.QueryRow(query)
lng := "" lng := ""
dt := res.Scan(&lng) dt := res.Scan(&lng)
@@ -41,20 +41,20 @@ func getMsgFromDB(sqldb *sql.DB, id string, lang string) string {
} }
return lng return lng
} }
func queryPacks(sqldb *sql.DB, element *elements) []packages{ func queryPacks(sqldb *sql.DB, element *elements) []packages {
pkg_list:= getPkgIdFromDB(sqldb) pkg_list := getPkgIdFromDB(sqldb)
pkgs := make([]packages,0) pkgs := make([]packages, 0)
for _,p := range pkg_list{ for _, p := range pkg_list {
query:= generateSQL("packs_all",[]string{"*"}, [2]string{"id",p} ) query := generateSQL("packs_all", []string{"*"}, [2]string{"id", p})
res, err := sqldb.Query(query) res, err := sqldb.Query(query)
defer res.Close() defer res.Close()
err = res.Err() err = res.Err()
if err != nil { if err != nil {
log.Panicln(err) log.Panicln(err)
} }
for res.Next(){ for res.Next() {
npkg := packages{} npkg := packages{}
err:=res.Scan(&npkg.Id, &npkg.Name, &npkg.Version, &npkg.ExtraCommand, &npkg.Tag, &npkg.Warning) err := res.Scan(&npkg.Id, &npkg.Name, &npkg.Version, &npkg.ExtraCommand, &npkg.Tag, &npkg.Warning)
if err != nil { if err != nil {
log.Fatalln(err) log.Fatalln(err)
} }
@@ -64,9 +64,9 @@ func queryPacks(sqldb *sql.DB, element *elements) []packages{
} }
return pkgs return pkgs
} }
func queryDatabase(sqldb *sql.DB, queryRow string) []string{ func queryDatabase(sqldb *sql.DB, queryRow string) []string {
res:= sqldb.QueryRow(queryRow) res := sqldb.QueryRow(queryRow)
var values []string var values []string
err := res.Scan(&values) err := res.Scan(&values)
if err != nil { if err != nil {
@@ -74,20 +74,75 @@ func queryDatabase(sqldb *sql.DB, queryRow string) []string{
} }
return values return values
} }
func generateSQL(table string, columns []string, arg ...[2]string) string{ func generateSQL(table string, columns []string, arg ...[2]string) string {
cols:=strings.Join(columns, ",") cols := strings.Join(columns, ",")
table="SELECT " + cols +" FROM " + table table = "SELECT " + cols + " FROM " + table
if len(arg) > 0{ if len(arg) > 0 {
table += " WHERE " table += " WHERE "
for i, a := range arg{ for i, a := range arg {
table += a[0] + " like '" + a[1] + "'" table += a[0] + " like '" + a[1] + "'"
if(i+1 < len(arg)){ if i+1 < len(arg) {
table += " and " table += " and "
} }
} }
} }
return table return table
} }
func searchDownloads(sqldb *sql.DB, table string, columns ...string) []DownloadElements {
query := generateSQL(table, columns)
runquery, err := sqldb.Query(query)
defer runquery.Close()
err = runquery.Err()
if err != nil {
log.Fatalln(err)
}
var elems []DownloadElements
var e DownloadElements
for runquery.Next() {
if len(columns) > 2 {
err = runquery.Scan(&e.ID, &e.Version, &e.Counter)
} else {
err = runquery.Scan(&e.ID, &e.Counter)
}
elems = append(elems, e)
}
return elems
}
func stats(sqldb *sql.DB, lang string) http.Handler {
return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
Counter := struct{
ElementsData elements
VersionStats []DownloadElements
TotalStats []DownloadElements
BodyClass string
Lang string
}{
ElementsData: elements{
Title: getMsgFromDB(sqldb, "title", lang),
Header: getMsgFromDB(sqldb, "header", lang),
Help: getMsgFromDB(sqldb, "help", lang),
Packagename: getMsgFromDB(sqldb, "packagename", lang),
Packageversion: getMsgFromDB(sqldb, "packageversion", lang),
Allow: getMsgFromDB(sqldb, "allow", lang),
Warning: getMsgFromDB(sqldb, "warning", lang),
Explain: getMsgFromDB(sqldb, "explain", lang),
},
BodyClass: "m",
VersionStats: searchDownloads(sqldb, "counterd", "program", "version","download_count"),
TotalStats: searchDownloads(sqldb, "count_all", "program","download_count"),
Lang: lang,
}
templates, err := template.ParseFiles("html/master.html", "html/statsitics.html")
if err != nil {
log.Println(err)
}
err = templates.ExecuteTemplate(res, "master", Counter)
if err != nil {
log.Println(err)
}
res.WriteHeader(http.StatusOK)
})
}
func getPkgIdFromDB(sqldb *sql.DB) []string { func getPkgIdFromDB(sqldb *sql.DB) []string {
query, err := sqldb.Query("SELECT id FROM packs_all") query, err := sqldb.Query("SELECT id FROM packs_all")
defer query.Close() defer query.Close()
@@ -97,7 +152,7 @@ func getPkgIdFromDB(sqldb *sql.DB) []string {
} }
var pkgs []string var pkgs []string
var tmpstr string var tmpstr string
for query.Next(){ for query.Next() {
err = query.Scan(&tmpstr) err = query.Scan(&tmpstr)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
@@ -110,36 +165,38 @@ func getPkgIdFromDB(sqldb *sql.DB) []string {
} }
return pkgs return pkgs
} }
func fullSearchDB(sqldb *sql.DB) []packages { func fullSearchPackagesDB(sqldb *sql.DB) []packages {
pkg_list:= getPkgIdFromDB(sqldb) pkg_list := getPkgIdFromDB(sqldb)
var pkgs []packages var pkgs []packages
for _,p :=range pkg_list{ for _, p := range pkg_list {
query:= generateSQL("packs_all",[]string{"*"}, [2]string{"id",p} ) query := generateSQL("packs_all", []string{"*"}, [2]string{"id", p})
res:= queryDatabase(sqldb, query) res := queryDatabase(sqldb, query)
var pkg packages var pkg packages
pkg, _=ConvertStringsToPackage(res) pkg, _ = ConvertStringsToPackage(res)
pkgs = append(pkgs, pkg) pkgs = append(pkgs, pkg)
} }
return pkgs return pkgs
} }
func index(sqldb *sql.DB) http.Handler { func index(sqldb *sql.DB, lang string) http.Handler {
return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
b := elements{ pageDataFromDatabase := elements{
Title: getMsgFromDB(sqldb, "title", "heb"), Title: getMsgFromDB(sqldb, "title", lang),
Header: getMsgFromDB(sqldb, "header", "heb"), Header: getMsgFromDB(sqldb, "header", lang),
Help: getMsgFromDB(sqldb, "help", "heb"), Help: getMsgFromDB(sqldb, "help", lang),
Packagename: getMsgFromDB(sqldb, "packagename", "heb"), Packagename: getMsgFromDB(sqldb, "packagename", lang),
Packageversion: getMsgFromDB(sqldb, "packageversion", "heb"), Packageversion: getMsgFromDB(sqldb, "packageversion", lang),
Allow: getMsgFromDB(sqldb, "allow", "heb"), Allow: getMsgFromDB(sqldb, "allow", lang),
Warning: getMsgFromDB(sqldb, "warning", "heb"), Warning: getMsgFromDB(sqldb, "warning", lang),
Explain: getMsgFromDB(sqldb, "explain", "heb"), Explain: getMsgFromDB(sqldb, "explain", lang),
} }
data := struct { data := struct {
ElementsData elements ElementsData elements
PackagesData []packages PackagesData []packages
Lang string
}{ }{
ElementsData: b, ElementsData: pageDataFromDatabase,
PackagesData: queryPacks(sqldb, &b), PackagesData: queryPacks(sqldb, &pageDataFromDatabase),
Lang: lang,
} }
templates, err := template.ParseFiles("html/master.html", "html/main.html") templates, err := template.ParseFiles("html/master.html", "html/main.html")
@@ -168,7 +225,9 @@ func main() {
db, err := sql.Open("sqlite", "file:progs.db") db, err := sql.Open("sqlite", "file:progs.db")
mux := http.NewServeMux() mux := http.NewServeMux()
mux.Handle("/public/", public()) mux.Handle("/public/", public())
mux.Handle("/", index(db)) mux.Handle("/", index(db, "heb"))
mux.Handle("/en", index(db, "eng"))
mux.Handle("/stats", stats(db,"eng"))
addr := fmt.Sprintf(":%s", "12312") addr := fmt.Sprintf(":%s", "12312")
server := http.Server{ server := http.Server{
Addr: addr, Addr: addr,

View File

@@ -44,3 +44,8 @@ type elements struct {
Warning string Warning string
Explain string Explain string
} }
type DownloadElements struct {
ID string
Version *string
Counter int
}

3
public/hebrew.css Normal file
View File

@@ -0,0 +1,3 @@
body{
direction: rtl;
}

View File

@@ -91,16 +91,17 @@ function downloadValue(elementId, filename){
function scriptPackage(rowid, extracommand, line){ function scriptPackage(rowid, extracommand, line){
let text = `winget install ${rowid} -s huji`; let text = `winget install ${rowid} -s huji`;
console.log(extracommand) console.log(extracommand)
let fub = extracommand.indexOf(' &amp;&amp;') let fub = extracommand.match(/\s?&&/)
fub = fub==null?-1:fub.index
console.log(`${rowid}, ${fub}`) console.log(`fub in row: ${rowid}, is ${fub}`)
console.log(`${rowid}, ${extracommand.length < 2}`) console.log(`extra command in line ${rowid}, has more than 2 lenght? ${extracommand.length < 2}. lenght${extracommand.length}`)
try{ try{
console.log(text) console.log(text)
if(fub == 0){ if(fub == 0){
text += extracommand; text += extracommand;
} }
else if((extracommand.length > 2)){ else if((extracommand.length > 2) && !(extracommand.match(/nil/))){
text = extracommand + " && " + text; text = extracommand + " && " + text;
} }
else if ((fub == -1)) else if ((fub == -1))