mirror of https://github.com/velour/catbase.git
meme: finishing up templating
This commit is contained in:
parent
b20da607bc
commit
b66038354a
|
@ -431,6 +431,9 @@ func (d *Discord) SetRole(userID, roleID string) error {
|
||||||
type CmdHandler func(s *discordgo.Session, i *discordgo.InteractionCreate)
|
type CmdHandler func(s *discordgo.Session, i *discordgo.InteractionCreate)
|
||||||
|
|
||||||
func (d *Discord) RegisterSlashCmd(c discordgo.ApplicationCommand, handler CmdHandler) error {
|
func (d *Discord) RegisterSlashCmd(c discordgo.ApplicationCommand, handler CmdHandler) error {
|
||||||
|
if !d.config.GetBool("registerSlash", true) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
cmd, err := d.client.ApplicationCommandCreate(d.client.State.User.ID, d.guildID, &c)
|
cmd, err := d.client.ApplicationCommandCreate(d.client.State.User.ID, d.guildID, &c)
|
||||||
d.cmdHandlers[c.Name] = handler
|
d.cmdHandlers[c.Name] = handler
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -1,107 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<!-- Load required Bootstrap and BootstrapVue CSS -->
|
|
||||||
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css"/>
|
|
||||||
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap-vue@^2/dist/bootstrap-vue.min.css"/>
|
|
||||||
|
|
||||||
<!-- Load polyfills to support older browsers -->
|
|
||||||
<script src="//polyfill.io/v3/polyfill.min.js?features=es2015%2CMutationObserver"></script>
|
|
||||||
|
|
||||||
<!-- Load Vue followed by BootstrapVue -->
|
|
||||||
<script src="//unpkg.com/vue@^2/dist/vue.min.js"></script>
|
|
||||||
<script src="//unpkg.com/bootstrap-vue@^2/dist/bootstrap-vue.min.js"></script>
|
|
||||||
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>Memes</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<div id="app">
|
|
||||||
<b-navbar>
|
|
||||||
<b-navbar-brand>Emojys</b-navbar-brand>
|
|
||||||
<b-navbar-nav>
|
|
||||||
<b-nav-item v-for="item in nav" :href="item.url" :active="item.name === 'Meme'" :key="item.key">{{ item.name
|
|
||||||
}}
|
|
||||||
</b-nav-item>
|
|
||||||
</b-navbar-nav>
|
|
||||||
</b-navbar>
|
|
||||||
|
|
||||||
<b-navbar>
|
|
||||||
<b-navbar-nav>
|
|
||||||
<b-nav-item href="/emojy/stats">Stats</b-nav-item>
|
|
||||||
<b-nav-item active href="/emojy/list">List</b-nav-item>
|
|
||||||
<b-nav-item href="/emojy/new">Upload</b-nav-item>
|
|
||||||
</b-navbar-nav>
|
|
||||||
</b-navbar>
|
|
||||||
|
|
||||||
<div
|
|
||||||
style="background-color:red;"
|
|
||||||
variant="error"
|
|
||||||
v-if="err != ''"
|
|
||||||
@click="err = ''">
|
|
||||||
{{ err }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row row-cols-5">
|
|
||||||
<div class="card text-center" v-for="name in fileKeys" key="name">
|
|
||||||
<div class="card-body">
|
|
||||||
<span>
|
|
||||||
<b-img-lazy :src="fileList[name]" class="card-img-top mx-auto d-block" :alt="name" width=100 style="max-width: 100px">
|
|
||||||
</span>
|
|
||||||
<h5 class="card-title">{{name}}</h5>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
var app = new Vue({
|
|
||||||
el: '#app',
|
|
||||||
data: function () {
|
|
||||||
return {
|
|
||||||
err: '',
|
|
||||||
view: '',
|
|
||||||
nav: [],
|
|
||||||
results: [],
|
|
||||||
fileKeys: [],
|
|
||||||
fileList: {},
|
|
||||||
image: null,
|
|
||||||
password: ''
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
view(newView, oldView) {
|
|
||||||
this.err = '';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
axios.get('/nav')
|
|
||||||
.then(resp => {
|
|
||||||
this.nav = resp.data;
|
|
||||||
})
|
|
||||||
.catch(err => console.log(err))
|
|
||||||
this.refresh();
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
refresh: function () {
|
|
||||||
axios.get('/emojy/all')
|
|
||||||
.then(resp => {
|
|
||||||
this.results = resp.data
|
|
||||||
this.err = ''
|
|
||||||
})
|
|
||||||
.catch(err => (this.err = err))
|
|
||||||
axios.get('/emojy/allFiles')
|
|
||||||
.then(resp => {
|
|
||||||
// stole this somewhere or other as a quick hack
|
|
||||||
this.fileKeys = Object.keys(resp.data).sort()
|
|
||||||
this.fileList = resp.data
|
|
||||||
this.err = ''
|
|
||||||
})
|
|
||||||
.catch(err => (this.err = err))
|
|
||||||
},
|
|
||||||
}
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,113 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<!-- Load required Bootstrap and BootstrapVue CSS -->
|
|
||||||
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css"/>
|
|
||||||
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap-vue@^2/dist/bootstrap-vue.min.css"/>
|
|
||||||
|
|
||||||
<!-- Load polyfills to support older browsers -->
|
|
||||||
<script src="//polyfill.io/v3/polyfill.min.js?features=es2015%2CMutationObserver"></script>
|
|
||||||
|
|
||||||
<!-- Load Vue followed by BootstrapVue -->
|
|
||||||
<script src="//unpkg.com/vue@^2/dist/vue.min.js"></script>
|
|
||||||
<script src="//unpkg.com/bootstrap-vue@^2/dist/bootstrap-vue.min.js"></script>
|
|
||||||
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>Memes</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<div id="app">
|
|
||||||
<b-navbar>
|
|
||||||
<b-navbar-brand>Emojys</b-navbar-brand>
|
|
||||||
<b-navbar-nav>
|
|
||||||
<b-nav-item v-for="item in nav" :href="item.url" :active="item.name === 'Meme'" :key="item.key">{{ item.name
|
|
||||||
}}
|
|
||||||
</b-nav-item>
|
|
||||||
</b-navbar-nav>
|
|
||||||
</b-navbar>
|
|
||||||
|
|
||||||
<b-navbar>
|
|
||||||
<b-navbar-nav>
|
|
||||||
<b-nav-item active href="/emojy/stats">Stats</b-nav-item>
|
|
||||||
<b-nav-item href="/emojy/list">List</b-nav-item>
|
|
||||||
<b-nav-item href="/emojy/new">Upload</b-nav-item>
|
|
||||||
</b-navbar-nav>
|
|
||||||
</b-navbar>
|
|
||||||
|
|
||||||
<div
|
|
||||||
style="background-color:red;"
|
|
||||||
variant="error"
|
|
||||||
v-if="err != ''"
|
|
||||||
@click="err = ''">
|
|
||||||
{{ err }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<ul style="list-style-type: none;">
|
|
||||||
<li v-for="category in results">
|
|
||||||
<ul v-if="category" style="list-style-type: none;">
|
|
||||||
<li v-for="emojy in category" key="emojy">
|
|
||||||
{{emojy.count}} -
|
|
||||||
<span v-if="name != 'emoji'">
|
|
||||||
<span v-if="emojy.onServer">✅</span>
|
|
||||||
<span v-else>❎</span>
|
|
||||||
-
|
|
||||||
</span>
|
|
||||||
<span v-if="emojy.url">
|
|
||||||
<img :src="emojy.url" :alt="emojy.name" class="img-thumbnail"
|
|
||||||
style="max-width: 64px; max-height: 64px"/> {{emojy.emojy}}
|
|
||||||
</span>
|
|
||||||
<span v-else>{{emojy.emojy}}</span>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
var app = new Vue({
|
|
||||||
el: '#app',
|
|
||||||
data: function () {
|
|
||||||
return {
|
|
||||||
err: '',
|
|
||||||
view: '',
|
|
||||||
nav: [],
|
|
||||||
results: [],
|
|
||||||
fileList: {},
|
|
||||||
image: null,
|
|
||||||
password: ''
|
|
||||||
}
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
view(newView, oldView) {
|
|
||||||
this.err = '';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
axios.get('/nav')
|
|
||||||
.then(resp => {
|
|
||||||
this.nav = resp.data;
|
|
||||||
})
|
|
||||||
.catch(err => console.log(err))
|
|
||||||
this.refresh();
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
refresh: function () {
|
|
||||||
axios.get('/emojy/all')
|
|
||||||
.then(resp => {
|
|
||||||
this.results = [resp.data["emojy"], resp.data["unknown"], resp.data["emoji"]]
|
|
||||||
this.err = ''
|
|
||||||
})
|
|
||||||
.catch(err => (this.err = err))
|
|
||||||
axios.get('/emojy/allFiles')
|
|
||||||
.then(resp => {
|
|
||||||
this.fileList = resp.data
|
|
||||||
this.err = ''
|
|
||||||
})
|
|
||||||
.catch(err => (this.err = err))
|
|
||||||
},
|
|
||||||
}
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -25,15 +25,40 @@ func (p *EmojyPlugin) registerWeb() {
|
||||||
r.HandleFunc("/allFiles", p.handleAllFiles)
|
r.HandleFunc("/allFiles", p.handleAllFiles)
|
||||||
r.HandleFunc("/upload", p.handleUpload)
|
r.HandleFunc("/upload", p.handleUpload)
|
||||||
r.HandleFunc("/file/{name}", p.handleEmojy)
|
r.HandleFunc("/file/{name}", p.handleEmojy)
|
||||||
r.HandleFunc("/stats", p.handlePage("stats.html"))
|
r.HandleFunc("/stats", p.handleStats)
|
||||||
r.HandleFunc("/list", p.handlePage("list.html"))
|
r.HandleFunc("/list", p.handleList)
|
||||||
r.HandleFunc("/new", p.handlePage("upload.html"))
|
r.HandleFunc("/new", p.handleUploadForm)
|
||||||
r.HandleFunc("/", p.handleIndex)
|
r.HandleFunc("/", p.handleStats)
|
||||||
p.b.GetWeb().RegisterWebName(r, "/emojy", "Emojys")
|
p.b.GetWeb().RegisterWebName(r, "/emojy", "Emojys")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *EmojyPlugin) handleIndex(w http.ResponseWriter, r *http.Request) {
|
type emojyMap map[string][]EmojyCount
|
||||||
http.Redirect(w, r, "/emojy/stats", http.StatusPermanentRedirect)
|
|
||||||
|
func (p *EmojyPlugin) handleUploadForm(w http.ResponseWriter, r *http.Request) {
|
||||||
|
p.b.GetWeb().Index("Emojy", p.uploadIndex()).Render(r.Context(), w)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *EmojyPlugin) handleList(w http.ResponseWriter, r *http.Request) {
|
||||||
|
threshold := p.c.GetInt("emojy.statthreshold", 1)
|
||||||
|
emojy, err := p.allCounts(threshold)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(w, "Error: %s", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
p.b.GetWeb().Index("Emojy", p.listTempl(emojy)).Render(r.Context(), w)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *EmojyPlugin) handleStats(w http.ResponseWriter, r *http.Request) {
|
||||||
|
threshold := p.c.GetInt("emojy.statthreshold", 1)
|
||||||
|
emojy, err := p.allCounts(threshold)
|
||||||
|
if err != nil {
|
||||||
|
w.WriteHeader(500)
|
||||||
|
log.Error().Err(err).Msgf("handleAll")
|
||||||
|
out, _ := json.Marshal(struct{ err error }{err})
|
||||||
|
w.Write(out)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
p.b.GetWeb().Index("Emojy", p.statsIndex(emojy)).Render(r.Context(), w)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *EmojyPlugin) handlePage(file string) func(w http.ResponseWriter, r *http.Request) {
|
func (p *EmojyPlugin) handlePage(file string) func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
@ -74,18 +99,16 @@ func (p *EmojyPlugin) handleAllFiles(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *EmojyPlugin) handleUpload(w http.ResponseWriter, r *http.Request) {
|
func (p *EmojyPlugin) handleUpload(w http.ResponseWriter, r *http.Request) {
|
||||||
enc := json.NewEncoder(w)
|
|
||||||
newFilePath, err := p.FileSave(r)
|
newFilePath, err := p.FileSave(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Msgf("could not upload file")
|
log.Error().Err(err).Msgf("could not upload file")
|
||||||
w.WriteHeader(500)
|
w.WriteHeader(500)
|
||||||
enc.Encode(struct{ err error }{fmt.Errorf("file not saved: %s", err)})
|
fmt.Fprintf(w, "Error with file upload")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.Debug().Msgf("uploaded file to %s", newFilePath)
|
log.Debug().Msgf("uploaded file to %s", newFilePath)
|
||||||
w.WriteHeader(200)
|
w.WriteHeader(200)
|
||||||
enc.Encode(struct{ file string }{newFilePath})
|
fmt.Fprintf(w, "success")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *EmojyPlugin) FileSave(r *http.Request) (string, error) {
|
func (p *EmojyPlugin) FileSave(r *http.Request) (string, error) {
|
||||||
|
@ -101,7 +124,7 @@ func (p *EmojyPlugin) FileSave(r *http.Request) (string, error) {
|
||||||
return "", fmt.Errorf("no files")
|
return "", fmt.Errorf("no files")
|
||||||
}
|
}
|
||||||
|
|
||||||
password := r.Form.Get("password")
|
password := r.FormValue("password")
|
||||||
if password != p.b.GetPassword() {
|
if password != p.b.GetPassword() {
|
||||||
return "", fmt.Errorf("incorrect password")
|
return "", fmt.Errorf("incorrect password")
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,20 @@ func (p *MemePlugin) Show(meme webResp) templ.Component {
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><div class=\"col-3\"><img class=\"img-thumbnail rounded\" alt=\"")
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"><div class=\"col-3\">")
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
var templ_7745c5c3_Var3 string
|
||||||
|
templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(meme.Name)
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `plugins/meme/meme.templ`, Line: 35, Col: 23}
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
|
||||||
|
if templ_7745c5c3_Err != nil {
|
||||||
|
return templ_7745c5c3_Err
|
||||||
|
}
|
||||||
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" <img class=\"img-thumbnail rounded\" alt=\"")
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
|
@ -81,20 +94,7 @@ func (p *MemePlugin) Show(meme webResp) templ.Component {
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"> ")
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("\"></div><div class=\"col-3\"><pre>")
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
var templ_7745c5c3_Var3 string
|
|
||||||
templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(meme.Name)
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `plugins/meme/meme.templ`, Line: 39, Col: 27}
|
|
||||||
}
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
|
|
||||||
if templ_7745c5c3_Err != nil {
|
|
||||||
return templ_7745c5c3_Err
|
|
||||||
}
|
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("</div><div class=\"col-3\"><pre>")
|
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue