Fix duplicating emotes with /reloademotes
Don't reload emotes directly into the global common.Emotes variable. Instead, load them into a new variable and write that to common.Emotes after the search for new emotes completes. Emotes should no longer duplicate for each run of `/reloademotes`. Also tweaked `/addemotes` to automatically reload emotes if nothing went wrong downloading a new set.
This commit is contained in:
parent
a941e2815e
commit
6347065dd4
|
@ -438,26 +438,7 @@ var commands = &CommandControl{
|
||||||
common.CNReloadEmotes.String(): Command{
|
common.CNReloadEmotes.String(): Command{
|
||||||
HelpText: "Reload the emotes on the server.",
|
HelpText: "Reload the emotes on the server.",
|
||||||
Function: func(cl *Client, args []string) (string, error) {
|
Function: func(cl *Client, args []string) (string, error) {
|
||||||
go func() {
|
go commandReloadEmotes(cl)
|
||||||
cl.SendServerMessage("Reloading emotes")
|
|
||||||
err := loadEmotes()
|
|
||||||
if err != nil {
|
|
||||||
common.LogErrorf("Unbale to reload emotes: %s\n", err)
|
|
||||||
//return "", err
|
|
||||||
|
|
||||||
cl.SendChatData(common.NewChatMessage("", "",
|
|
||||||
err.Error(),
|
|
||||||
common.CmdlUser, common.MsgCommandResponse))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
cl.belongsTo.AddChatMsg(common.NewChatHiddenMessage(common.CdEmote, common.Emotes))
|
|
||||||
cl.belongsTo.AddModNotice(cl.name + " has reloaded emotes")
|
|
||||||
|
|
||||||
num := len(common.Emotes)
|
|
||||||
common.LogInfof("Loaded %d emotes\n", num)
|
|
||||||
cl.belongsTo.AddModNotice(fmt.Sprintf("%s reloaded %d emotes.", cl.name, num))
|
|
||||||
}()
|
|
||||||
return "Reloading emotes...", nil
|
return "Reloading emotes...", nil
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -558,6 +539,8 @@ var commands = &CommandControl{
|
||||||
}
|
}
|
||||||
|
|
||||||
cl.belongsTo.AddModNotice(cl.name + " has added emotes from the following channels: " + strings.Join(args, ", "))
|
cl.belongsTo.AddModNotice(cl.name + " has added emotes from the following channels: " + strings.Join(args, ", "))
|
||||||
|
|
||||||
|
commandReloadEmotes(cl)
|
||||||
}()
|
}()
|
||||||
return "Emote download initiated for the following channels: " + strings.Join(args, ", "), nil
|
return "Emote download initiated for the following channels: " + strings.Join(args, ", "), nil
|
||||||
},
|
},
|
||||||
|
@ -633,3 +616,24 @@ func getHelp(lvl common.CommandLevel) map[string]string {
|
||||||
}
|
}
|
||||||
return helptext
|
return helptext
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func commandReloadEmotes(cl *Client) {
|
||||||
|
cl.SendServerMessage("Reloading emotes")
|
||||||
|
err := loadEmotes()
|
||||||
|
if err != nil {
|
||||||
|
common.LogErrorf("Unbale to reload emotes: %s\n", err)
|
||||||
|
//return "", err
|
||||||
|
|
||||||
|
cl.SendChatData(common.NewChatMessage("", "",
|
||||||
|
err.Error(),
|
||||||
|
common.CmdlUser, common.MsgCommandResponse))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
cl.belongsTo.AddChatMsg(common.NewChatHiddenMessage(common.CdEmote, common.Emotes))
|
||||||
|
cl.belongsTo.AddModNotice(cl.name + " has reloaded emotes")
|
||||||
|
|
||||||
|
num := len(common.Emotes)
|
||||||
|
common.LogInfof("Loaded %d emotes\n", num)
|
||||||
|
cl.belongsTo.AddModNotice(fmt.Sprintf("%s reloaded %d emotes.", cl.name, num))
|
||||||
|
}
|
||||||
|
|
|
@ -14,10 +14,14 @@ var Emotes EmotesMap
|
||||||
var reStripStatic = regexp.MustCompile(`^(\\|/)?static`)
|
var reStripStatic = regexp.MustCompile(`^(\\|/)?static`)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
Emotes = map[string]string{}
|
Emotes = NewEmotesMap()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (em EmotesMap) Add(fullpath string) {
|
func NewEmotesMap() EmotesMap {
|
||||||
|
return map[string]string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (em EmotesMap) Add(fullpath string) EmotesMap {
|
||||||
fullpath = reStripStatic.ReplaceAllLiteralString(fullpath, "")
|
fullpath = reStripStatic.ReplaceAllLiteralString(fullpath, "")
|
||||||
|
|
||||||
base := filepath.Base(fullpath)
|
base := filepath.Base(fullpath)
|
||||||
|
@ -35,8 +39,9 @@ func (em EmotesMap) Add(fullpath string) {
|
||||||
code = fmt.Sprintf("%s-%d", code, num)
|
code = fmt.Sprintf("%s-%d", code, num)
|
||||||
}
|
}
|
||||||
|
|
||||||
Emotes[code] = fullpath
|
em[code] = fullpath
|
||||||
fmt.Printf("Added emote %s at path %q\n", code, fullpath)
|
//fmt.Printf("Added emote %s at path %q\n", code, fullpath)
|
||||||
|
return em
|
||||||
}
|
}
|
||||||
|
|
||||||
func EmoteToHtml(file, title string) string {
|
func EmoteToHtml(file, title string) string {
|
||||||
|
|
38
emotes.go
38
emotes.go
|
@ -29,18 +29,20 @@ type EmoteInfo struct {
|
||||||
|
|
||||||
func loadEmotes() error {
|
func loadEmotes() error {
|
||||||
//fmt.Println(processEmoteDir(emoteDir))
|
//fmt.Println(processEmoteDir(emoteDir))
|
||||||
err := processEmoteDir(emoteDir)
|
newEmotes, err := processEmoteDir(emoteDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
common.Emotes = newEmotes
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func processEmoteDir(path string) error {
|
func processEmoteDir(path string) (common.EmotesMap, error) {
|
||||||
dirInfo, err := ioutil.ReadDir(path)
|
dirInfo, err := ioutil.ReadDir(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "could not open emoteDir:")
|
return nil, errors.Wrap(err, "could not open emoteDir:")
|
||||||
}
|
}
|
||||||
|
|
||||||
subDirs := []string{}
|
subDirs := []string{}
|
||||||
|
@ -53,54 +55,62 @@ func processEmoteDir(path string) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
em := common.NewEmotesMap()
|
||||||
// Find top level emotes
|
// Find top level emotes
|
||||||
err = findEmotes(path)
|
em, err = findEmotes(path, em)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "could not findEmotes() in top level directory:")
|
return nil, errors.Wrap(err, "could not findEmotes() in top level directory:")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get second level subdirs (eg, "twitch", "zorchenhimer", etc)
|
// Get second level subdirs (eg, "twitch", "zorchenhimer", etc)
|
||||||
for _, dir := range subDirs {
|
for _, dir := range subDirs {
|
||||||
subd, err := ioutil.ReadDir(filepath.Join(path, dir))
|
subd, err := ioutil.ReadDir(filepath.Join(path, dir))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
fmt.Printf("Error reading dir %q: %v\n", subd, err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for _, d := range subd {
|
for _, d := range subd {
|
||||||
if d.IsDir() {
|
if d.IsDir() {
|
||||||
//emotes = append(emotes, findEmotes(filepath.Join(path, dir, d.Name()))...)
|
//emotes = append(emotes, findEmotes(filepath.Join(path, dir, d.Name()))...)
|
||||||
findEmotes(filepath.Join(path, dir, d.Name()))
|
p := filepath.Join(path, dir, d.Name())
|
||||||
|
em, err = findEmotes(p, em)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Error finding emotes in %q: %v\n", p, err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
fmt.Printf("processEmoteDir: %d\n", len(em))
|
||||||
|
return em, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func findEmotes(dir string) error {
|
func findEmotes(dir string, em common.EmotesMap) (common.EmotesMap, error) {
|
||||||
|
//em := NewEmotesMap()
|
||||||
|
|
||||||
fmt.Printf("finding emotes in %q\n", dir)
|
fmt.Printf("finding emotes in %q\n", dir)
|
||||||
emotePNGs, err := filepath.Glob(filepath.Join(dir, "*.png"))
|
emotePNGs, err := filepath.Glob(filepath.Join(dir, "*.png"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
//return 0, fmt.Errorf("unable to glob emote directory: %s\n", err)
|
return em, fmt.Errorf("unable to glob emote directory: %s\n", err)
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
fmt.Printf("%d emotePNGs\n", len(emotePNGs))
|
fmt.Printf("%d emotePNGs\n", len(emotePNGs))
|
||||||
|
|
||||||
emoteGIFs, err := filepath.Glob(filepath.Join(dir, "*.gif"))
|
emoteGIFs, err := filepath.Glob(filepath.Join(dir, "*.gif"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "unable to glob emote directory:")
|
return em, errors.Wrap(err, "unable to glob emote directory:")
|
||||||
}
|
}
|
||||||
fmt.Printf("%d emoteGIFs\n", len(emoteGIFs))
|
fmt.Printf("%d emoteGIFs\n", len(emoteGIFs))
|
||||||
|
|
||||||
for _, file := range emotePNGs {
|
for _, file := range emotePNGs {
|
||||||
common.Emotes.Add(file)
|
em = em.Add(file)
|
||||||
//emotes = append(emotes, common.Emote{FullPath: dir, Code: file})
|
//emotes = append(emotes, common.Emote{FullPath: dir, Code: file})
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, file := range emoteGIFs {
|
for _, file := range emoteGIFs {
|
||||||
common.Emotes.Add(file)
|
em = em.Add(file)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return em, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getEmotes(names []string) error {
|
func getEmotes(names []string) error {
|
||||||
|
|
Loading…
Reference in New Issue