John1561's picture
Upload 47 files
791db78
package handler
import (
"bytes"
"fmt"
"math"
"math/rand"
"regexp"
"strconv"
"strings"
"time"
"github.com/zijiren233/stable-diffusion-webui-bot/cache"
"github.com/zijiren233/stable-diffusion-webui-bot/db"
parseflag "github.com/zijiren233/stable-diffusion-webui-bot/flag"
"github.com/zijiren233/stable-diffusion-webui-bot/gconfig"
api "github.com/zijiren233/stable-diffusion-webui-bot/stable-diffusion-webui-api"
"github.com/zijiren233/stable-diffusion-webui-bot/user"
"github.com/zijiren233/stable-diffusion-webui-bot/utils"
tgbotapi "github.com/zijiren233/tg-bot-api/v6"
"github.com/zijiren233/go-colorlog"
"gopkg.in/yaml.v3"
)
func returnCallback(bot *tgbotapi.BotAPI, CallbackQuery *tgbotapi.CallbackQuery) {
bot.Request(tgbotapi.NewCallback(CallbackQuery.ID, ""))
}
func HandleCallback(bot *tgbotapi.BotAPI, CallbackQuery *tgbotapi.CallbackQuery) {
defer returnCallback(bot, CallbackQuery)
data := tgbotapi.ParseCbkData(CallbackQuery)
if ch, ok := bot.FindCbk(CallbackQuery.Message.Chat.ID, CallbackQuery.From.ID, CallbackQuery.Message.MessageID); ok {
select {
case ch.Chan() <- data:
default:
}
return
}
u, err := user.LoadAndInitUser(bot, CallbackQuery.From.ID)
if err != nil {
colorlog.Errorf("Load And Init User Err: %v", err)
return
}
switch data.Key {
default:
return
case "panel":
panel(bot, CallbackQuery, data, u)
case "default":
defaultPanel(bot, CallbackQuery, data, u)
case "setDft":
setDft(bot, CallbackQuery, data, u)
case "share":
shareCbk(bot, CallbackQuery, data, u)
case "setCfg":
setCfg(bot, CallbackQuery, data, u)
case "reDraw":
reDraw(bot, CallbackQuery, u)
case "editCfg":
editCfg(bot, CallbackQuery, data, u)
case "editImg":
editImg(bot, CallbackQuery, u)
case "fineTune":
fineTune(bot, CallbackQuery, data.Value, u)
case "openImageButton":
openImageButton(bot, CallbackQuery, data, u)
case "spr":
superResolution(bot, CallbackQuery, data, u)
case "delete":
bot.Send(tgbotapi.NewDeleteMessage(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID))
case "cmd-spr":
bot.Send(tgbotapi.NewDeleteMessage(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID))
case "lang":
lang(bot, CallbackQuery, data, u)
case "helpLang":
helpLang(bot, CallbackQuery, data, u)
case "drawpool":
drawpool(bot, CallbackQuery, data, u)
}
}
func shareCbk(bot *tgbotapi.BotAPI, CallbackQuery *tgbotapi.CallbackQuery, data *tgbotapi.ChanData, u *user.UserInfo) {
if u.Permissions() != user.T_Subscribe {
msg := tgbotapi.NewMessage(CallbackQuery.Message.Chat.ID, fmt.Sprintf("%s\n%s", u.LoadLang("shareInfo"), u.LoadLang("mustShare")))
msg.ReplyToMessageID = CallbackQuery.Message.MessageID
msg.ReplyMarkup = goJoinButton(u)
bot.Send(msg)
return
}
i, err := strconv.ParseInt(data.Value, 10, 64)
if err != nil {
return
}
if i == 0 {
u.ChangeShare(false)
} else {
u.ChangeShare(true)
}
var option string
if u.UserInfo.SharePhoto {
option = u.LoadLang("enable")
} else {
option = u.LoadLang("disable")
}
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s: %s", u.LoadLang("shareInfo"), option))
msg.ReplyMarkup = gShareButton(u)
bot.Send(msg)
}
func editCfg(bot *tgbotapi.BotAPI, CallbackQuery *tgbotapi.CallbackQuery, data *tgbotapi.ChanData, u *user.UserInfo) {
cfg := &Config{}
err := yaml.Unmarshal([]byte(CallbackQuery.Message.Text), cfg)
if err != nil {
colorlog.Error(err)
return
}
getConfig(bot, u, cfg, CallbackQuery.Message.MessageID)
}
func drawpool(bot *tgbotapi.BotAPI, CallbackQuery *tgbotapi.CallbackQuery, data *tgbotapi.ChanData, u *user.UserInfo) {
if u.UserInfo.UserID != parseflag.MyID {
return
}
msg := tgbotapi.NewEditMessageTextAndMarkup(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("```\npool: %d\nfree: %d\nwait: %d\ntime: %v\n```", api.DrawPoolCap(), api.DrawFree(), api.DrawWait(), time.Now().Format("01-02 15:04:05")), poolButton)
msg.ParseMode = "Markdown"
bot.Send(msg)
}
func helpLang(bot *tgbotapi.BotAPI, CallbackQuery *tgbotapi.CallbackQuery, data *tgbotapi.ChanData, u *user.UserInfo) {
if err := u.SetLang(data.Value); err != nil {
colorlog.Errorf("Set Language err [%s] : %v", CallbackQuery.From.String(), err)
} else {
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n\nYou Can Use Website\nUser ID: `%d`\nPassword: `%s`", u.LoadLang("help"), u.UserInfo.UserID, u.Passwd()))
msg.ParseMode = "Markdown"
msg.ReplyMarkup = &tgbotapi.InlineKeyboardMarkup{InlineKeyboard: append(helpLangButton.InlineKeyboard, clictUrlButton(u, fmt.Sprintf("https://%s/login", parseflag.WEBSITE)).InlineKeyboard...)}
bot.Send(msg)
}
}
func lang(bot *tgbotapi.BotAPI, CallbackQuery *tgbotapi.CallbackQuery, data *tgbotapi.ChanData, u *user.UserInfo) {
if err := u.SetLang(data.Value); err != nil {
colorlog.Errorf("Set Language err [%s] : %v", CallbackQuery.From.String(), err)
} else {
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, u.LoadLang("setLangSuccess"))
msg.ReplyMarkup = langButton
bot.Send(msg)
}
}
func openImageButton(bot *tgbotapi.BotAPI, CallbackQuery *tgbotapi.CallbackQuery, data *tgbotapi.ChanData, u *user.UserInfo) {
spr, err := strconv.ParseBool(data.Value)
if err != nil {
return
}
msg := tgbotapi.NewEditMessageReplyMarkup(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, *imgButton(u, spr))
bot.Send(msg)
}
func defaultPanel(bot *tgbotapi.BotAPI, CallbackQuery *tgbotapi.CallbackQuery, data *tgbotapi.ChanData, u *user.UserInfo) {
switch data.Value {
case "panel":
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, u.LoadLang("setDft"))
msg.ReplyMarkup = setDefaultCfg(u)
bot.Send(msg)
case "mode":
var msg tgbotapi.EditMessageTextConfig
if u.UserInfo.UserDefaultMODE == "" {
msg = tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprint(u.LoadLang("setDft"), " ", u.LoadLang("mode")))
msg.ReplyMarkup = generateSetDftMODEButton(u)
} else {
msg = tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprint(u.LoadLang("setDft"), " ", u.LoadLang("mode")))
msg.ReplyMarkup = generateSetDftMODEButton(u)
}
bot.Send(msg)
case "uc":
var msg tgbotapi.EditMessageTextConfig
if u.UserInfo.UserDefaultUC == "" {
msg = tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s %s:\n```\n%s\n```", u.LoadLang("setDft"), u.LoadLang("unwanted"), api.DefauleUC()))
} else {
msg = tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s %s:\n```\n%s\n```", u.LoadLang("setDft"), u.LoadLang("unwanted"), u.UserInfo.UserDefaultUC))
}
msg.ReplyMarkup = generateSetDftUCButton(u)
msg.ParseMode = "Markdown"
bot.Send(msg)
case "number":
var msg tgbotapi.EditMessageTextConfig
if u.UserInfo.UserDefaultNumber == 0 {
msg = tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprint(u.LoadLang("setDft"), " ", u.LoadLang("number")))
} else {
msg = tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprint(u.LoadLang("setDft"), " ", u.LoadLang("number")))
}
msg.ReplyMarkup = generateSetDftNumberButton(u)
bot.Send(msg)
case "scale":
var msg tgbotapi.EditMessageTextConfig
if u.UserInfo.UserDefaultScale == 0 {
msg = tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s %s:\n%d", u.LoadLang("setDft"), u.LoadLang("scale"), api.DefaultCfgScale))
} else {
msg = tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s %s:\n%d", u.LoadLang("setDft"), u.LoadLang("scale"), u.UserInfo.UserDefaultScale))
}
msg.ReplyMarkup = generateSetDftScaleButton(u)
bot.Send(msg)
case "steps":
var msg tgbotapi.EditMessageTextConfig
if u.UserInfo.UserDefaultSteps == 0 {
msg = tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s %s:\n%d", u.LoadLang("setDft"), u.LoadLang("steps"), api.DefaultSteps))
} else {
msg = tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s %s:\n%d", u.LoadLang("setDft"), u.LoadLang("steps"), u.UserInfo.UserDefaultSteps))
}
msg.ReplyMarkup = generateSetDftStepsButton(u)
bot.Send(msg)
}
}
func setDft(bot *tgbotapi.BotAPI, CallbackQuery *tgbotapi.CallbackQuery, data *tgbotapi.ChanData, u *user.UserInfo) {
before, after, found := strings.Cut(data.Value, ":")
data.Key = before
if found {
data.Value = after
} else {
data.Value = before
}
switch data.Key {
case "mode":
u.ChangeDefaultMODE(data.Value)
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprint(u.LoadLang("setDft"), " ", u.LoadLang("mode")))
msg.ReplyMarkup = generateSetDftMODEButton(u)
bot.Send(msg)
case "uc":
if data.Value == "reset" {
u.ChangeDefaultUC("")
} else {
m, err := bot.NewMsgCbk(CallbackQuery.Message.Chat.ID, CallbackQuery.From.ID)
if err != nil {
return
}
defer m.Close()
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, u.LoadLang("sendTag"))
msg.ReplyMarkup = cancelButton(u)
bot.Send(msg)
c, err := bot.NewCbk(CallbackQuery.Message.Chat.ID, CallbackQuery.From.ID, CallbackQuery.Message.MessageID)
if err != nil {
colorlog.Error(err)
return
}
defer c.Close()
t := time.NewTimer(time.Minute * 3)
defer t.Stop()
select {
case <-t.C:
case <-c.Chan():
case msg, ok := <-m.MsgChan():
if ok {
u.ChangeDefaultUC(msg.Text)
}
}
}
var msg tgbotapi.EditMessageTextConfig
if u.UserInfo.UserDefaultUC == "" {
msg = tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s %s:\n```\n%s\n```", u.LoadLang("setDft"), u.LoadLang("unwanted"), api.DefauleUC()))
} else {
msg = tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s %s:\n```\n%s\n```", u.LoadLang("setDft"), u.LoadLang("unwanted"), u.UserInfo.UserDefaultUC))
}
msg.ParseMode = "Markdown"
msg.ReplyMarkup = generateSetDftUCButton(u)
bot.Send(msg)
case "number":
u2, err := strconv.ParseUint(data.Value, 10, 64)
if err != nil {
colorlog.Error(err)
}
u.ChangeDefaultNumber(int(u2))
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprint(u.LoadLang("setDft"), " ", u.LoadLang("number")))
msg.ReplyMarkup = generateSetDftNumberButton(u)
bot.Send(msg)
case "scale":
if u.UserInfo.UserDefaultScale == 0 {
u.UserInfo.UserDefaultScale = api.DefaultCfgScale
}
switch data.Value {
case "+":
u.ChangeDefaultScale(u.UserInfo.UserDefaultScale + 1)
case "-":
u.ChangeDefaultScale(u.UserInfo.UserDefaultScale - 1)
}
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s %s:\n%d", u.LoadLang("setDft"), u.LoadLang("scale"), u.UserInfo.UserDefaultScale))
msg.ReplyMarkup = generateSetDftScaleButton(u)
bot.Send(msg)
case "steps":
if u.UserInfo.UserDefaultSteps == 0 {
u.UserInfo.UserDefaultSteps = api.DefaultSteps
}
switch data.Value {
case "+":
u.ChangeDefaultSteps(u.UserInfo.UserDefaultSteps + 1)
case "-":
u.ChangeDefaultSteps(u.UserInfo.UserDefaultSteps - 1)
}
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s %s:\n%d", u.LoadLang("setDft"), u.LoadLang("steps"), u.UserInfo.UserDefaultSteps))
msg.ReplyMarkup = generateSetDftStepsButton(u)
bot.Send(msg)
}
}
func editImg(bot *tgbotapi.BotAPI, CallbackQuery *tgbotapi.CallbackQuery, u *user.UserInfo) {
cfg := new(Config)
fileID := utils.GetFileNamePrefix(CallbackQuery.Message.Document.FileName)
var err error
var prePhoto []byte
prePhoto, err = cache.GetFile(fileID)
if err != nil {
prePhoto, err = bot.GetFileData(CallbackQuery.Message.Document.FileID)
if err != nil {
colorlog.Error(err)
return
}
_, err := cache.Put(prePhoto)
if err != nil {
colorlog.Errorf("Put file err: %v", err)
return
}
}
config, err := api.GetImgCfg(prePhoto)
if err != nil {
colorlog.Error(err)
return
}
cfg.DrawConfig = *config
cfg.PrePhotoID = fileID
cfg.Steps = 28
cfg.Strength = 0.6
cfg.Mode = "DDIM"
cfg.Seed = 0
getConfig(bot, u, cfg, CallbackQuery.Message.MessageID)
}
func getAllExtraModelName(tags, types string) (AllExtraModel []string) {
re := regexp.MustCompile(fmt.Sprintf(`<%s:(.*?):((?:-?\d+)(?:\.\d+)?)>`, types))
s := re.FindAllStringSubmatch(tags, -1)
for _, v := range s {
if len(v) == 3 {
AllExtraModel = append(AllExtraModel, v[1])
}
}
return
}
func getAllTag(tags string, re ...interface{ MatchString(b string) bool }) (allTag []string) {
return purge(strings.Split(tags, ","), []func(string) string{strings.TrimSpace}, re)
}
func getAllTagName(tags string, re ...interface{ MatchString(b string) bool }) []string {
return purge(strings.Split(tags, ","), []func(string) string{strings.TrimSpace, func(s string) string { name, _ := getTagName(s); return name }}, re)
}
func purge(all []string, preprocessing []func(string) string, re []interface{ MatchString(b string) bool }) (purged []string) {
var Matchd bool
for _, v := range all {
for _, f := range preprocessing {
v = f(v)
}
if v == "" {
continue
}
for _, r := range re {
if r.MatchString(v) {
Matchd = true
break
}
}
if Matchd {
Matchd = false
continue
}
purged = append(purged, v)
}
return
}
func getTagName(tag string) (name string, strength float64) {
if tag == "" {
return "", 0
}
for (strings.HasPrefix(tag, "(") && strings.HasSuffix(tag, ")")) || (strings.HasPrefix(tag, "[") && strings.HasSuffix(tag, "]")) {
tag = tag[1 : len(tag)-1]
}
i := strings.LastIndex(tag, ":")
if i == -1 {
return tag, 0
}
f, err := strconv.ParseFloat(tag[i+1:], 64)
if err != nil {
return tag, 0
}
return tag[:i], f
}
var reDefaultTag, _ = regexp.Compile(`^masterpiece$|^best quality$|^<lora:.*?:(-?\d+)(\.\d+)?>$|^<hypernet:.*?:(-?\d+)(\.\d+)?>$`)
var reDefaultUc, _ = regexp.Compile(`^lowres$|^text$`)
func setCfg(bot *tgbotapi.BotAPI, CallbackQuery *tgbotapi.CallbackQuery, data *tgbotapi.ChanData, u *user.UserInfo) {
before, after, found := strings.Cut(data.Value, ":")
data.Key = before
if found {
data.Value = after
} else {
data.Value = before
}
cfg := &Config{}
err := yaml.Unmarshal([]byte(CallbackQuery.Message.Text), cfg)
if err != nil {
colorlog.Error(err)
return
}
switch data.Key {
case "editTag":
i, err := strconv.ParseInt(data.Value, 10, 64)
if err != nil {
colorlog.Error(err)
return
}
allTag := getAllTag(cfg.Tag, reDefaultTag)
bot.Send(tgbotapi.NewEditMessageReplyMarkup(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, *editTagButton(u, int(i), allTag, allTag)))
case "changeTag":
i := strings.LastIndex(data.Value, ":")
page, err := strconv.ParseInt(data.Value[i+1:], 10, 64)
if err != nil {
colorlog.Error(err)
return
}
switch data.Value[:i] {
case "Happend", "Eappend", "reset":
m, err := bot.NewMsgCbk(CallbackQuery.Message.Chat.ID, CallbackQuery.From.ID)
if err != nil {
return
}
defer m.Close()
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("sendTag"))))
msg.ReplyMarkup = cancelButton(u)
msg.ParseMode = "HTML"
bot.Send(msg)
c, err := bot.NewCbk(CallbackQuery.Message.Chat.ID, CallbackQuery.From.ID, CallbackQuery.Message.MessageID)
if err != nil {
colorlog.Error(err)
return
}
defer c.Close()
t := time.NewTimer(time.Minute * 3)
defer t.Stop()
select {
case <-t.C:
case <-c.Chan():
case msg, ok := <-m.MsgChan():
if ok {
switch data.Value[:i] {
case "Happend":
cfg.Tag = fmt.Sprintf("%s, %s", msg.Text, cfg.Tag)
case "Eappend":
cfg.Tag = fmt.Sprintf("%s, %s", cfg.Tag, msg.Text)
default:
cfg.Tag = msg.Text
}
}
}
}
cfg.CorrectCfg(u, true, false, data.Value[:i] == "translation", false, true)
allTag := getAllTag(cfg.Tag, reDefaultTag)
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = editTagButton(u, int(page), allTag, allTag)
msg.ParseMode = "HTML"
bot.Send(msg)
return
case "sT":
i := strings.LastIndex(data.Value, ":")
tag := data.Value[:i]
page, err := strconv.ParseInt(data.Value[i+1:], 10, 64)
if err != nil {
colorlog.Error(err)
return
}
allTag := getAllTag(cfg.Tag)
var nowTag []string
if k, ok := utils.InString(tag, allTag); ok {
nowTag = append(nowTag, allTag[:k]...)
nowTag = append(nowTag, allTag[k+1:]...)
cfg.Tag = strings.Join(nowTag, ", ")
} else {
name, strength := getTagName(tag)
if strength == 0 {
strength = 1
}
allTag = append(allTag, fmt.Sprintf("(%s:%.1f)", name, strength))
nowTag = allTag
cfg.Tag = strings.Join(allTag, ", ")
}
cfg.CorrectCfg(u, true, false, false, false, true)
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = editTagButton(u, int(page), nowTag, purge(allTag, []func(string) string{strings.TrimSpace}, []interface{ MatchString(b string) bool }{reDefaultTag}))
msg.ParseMode = "HTML"
bot.Send(msg)
case "T":
i := strings.LastIndex(data.Value, ":")
page, err := strconv.ParseInt(data.Value[i+1:], 10, 64)
if err != nil {
colorlog.Error(err)
return
}
before := data.Value[:i]
i = strings.LastIndex(before, ":")
tag := before[:i]
allTag := getAllTag(cfg.Tag)
if k, ok := utils.InString(tag, allTag); ok {
name, f := getTagName(allTag[k])
if f <= 0 {
f = 1
}
switch before[i+1:] {
case "+":
if f+0.1 >= 2 {
f = 2
} else {
f += 0.1
}
case "-":
if f-0.1 < 0 {
f = 0.1
} else {
f -= 0.1
}
}
allTag[k] = fmt.Sprintf("(%s:%.1f)", name, f)
} else {
name, f := getTagName(tag)
if f == 0 {
f = 1
}
allTag = append(allTag, fmt.Sprintf("(%s:%.1f)", name, f))
}
cfg.Tag = strings.Join(allTag, ", ")
cfg.CorrectCfg(u, true, false, false, false, true)
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = editTagButton(u, int(page), allTag, purge(allTag, []func(string) string{strings.TrimSpace}, []interface{ MatchString(b string) bool }{reDefaultTag}))
msg.ParseMode = "HTML"
bot.Send(msg)
case "editUc":
i, err := strconv.ParseInt(data.Value, 10, 64)
if err != nil {
colorlog.Error(err)
return
}
allUc := getAllTag(cfg.Uc, reDefaultUc)
bot.Send(tgbotapi.NewEditMessageReplyMarkup(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, *editUcButton(u, int(i), allUc, allUc)))
case "changeUc":
i := strings.LastIndex(data.Value, ":")
page, err := strconv.ParseInt(data.Value[i+1:], 10, 64)
if err != nil {
colorlog.Error(err)
return
}
switch data.Value[:i] {
case "Happend", "Eappend", "reset":
m, err := bot.NewMsgCbk(CallbackQuery.Message.Chat.ID, CallbackQuery.From.ID)
if err != nil {
return
}
defer m.Close()
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("sendTag"))))
msg.ReplyMarkup = cancelButton(u)
msg.ParseMode = "HTML"
bot.Send(msg)
c, err := bot.NewCbk(CallbackQuery.Message.Chat.ID, CallbackQuery.From.ID, CallbackQuery.Message.MessageID)
if err != nil {
colorlog.Error(err)
return
}
defer c.Close()
t := time.NewTimer(time.Minute * 3)
defer t.Stop()
select {
case <-t.C:
case <-c.Chan():
case msg, ok := <-m.MsgChan():
if ok {
switch data.Value[:i] {
case "Happend":
cfg.Uc = fmt.Sprintf("%s, %s", msg.Text, cfg.Uc)
case "Eappend":
cfg.Uc = fmt.Sprintf("%s, %s", cfg.Uc, msg.Text)
default:
cfg.Uc = msg.Text
}
}
}
}
cfg.CorrectCfg(u, false, true, false, data.Value[:i] == "translation", true)
allUc := getAllTag(cfg.Uc, reDefaultUc)
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = editUcButton(u, int(page), allUc, allUc)
msg.ParseMode = "HTML"
bot.Send(msg)
return
case "sU":
i := strings.LastIndex(data.Value, ":")
uc := data.Value[:i]
page, err := strconv.ParseInt(data.Value[i+1:], 10, 64)
if err != nil {
colorlog.Error(err)
return
}
allUc := getAllTag(cfg.Uc)
var nowUc []string
if k, ok := utils.InString(uc, allUc); ok {
nowUc = append(nowUc, allUc[:k]...)
nowUc = append(nowUc, allUc[k+1:]...)
cfg.Uc = strings.Join(nowUc, ", ")
} else {
name, strength := getTagName(uc)
if strength == 0 {
strength = 1
}
allUc = append(allUc, fmt.Sprintf("(%s:%.1f)", name, strength))
nowUc = allUc
cfg.Uc = strings.Join(allUc, ", ")
}
cfg.CorrectCfg(u, false, true, false, false, true)
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = editUcButton(u, int(page), nowUc, purge(allUc, []func(string) string{strings.TrimSpace}, []interface{ MatchString(b string) bool }{reDefaultUc}))
msg.ParseMode = "HTML"
bot.Send(msg)
case "uc":
i := strings.LastIndex(data.Value, ":")
page, err := strconv.ParseInt(data.Value[i+1:], 10, 64)
if err != nil {
colorlog.Error(err)
return
}
before := data.Value[:i]
i = strings.LastIndex(before, ":")
uc := before[:i]
allUc := getAllTag(cfg.Uc)
if k, ok := utils.InString(uc, allUc); ok {
name, f := getTagName(allUc[k])
if f <= 0 {
f = 1
}
switch before[i+1:] {
case "+":
if f+0.1 >= 2 {
f = 2
} else {
f += 0.1
}
case "-":
if f-0.1 < 0 {
f = 0.1
} else {
f -= 0.1
}
}
allUc[k] = fmt.Sprintf("(%s:%.1f)", name, f)
} else {
name, f := getTagName(uc)
if f == 0 {
f = 1
}
allUc = append(allUc, fmt.Sprintf("(%s:%.1f)", name, f))
}
cfg.Uc = strings.Join(allUc, ", ")
cfg.CorrectCfg(u, true, false, false, false, true)
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = editUcButton(u, int(page), allUc, purge(allUc, []func(string) string{strings.TrimSpace}, []interface{ MatchString(b string) bool }{reDefaultUc}))
msg.ParseMode = "HTML"
bot.Send(msg)
case "sL":
group, after, ok := strings.Cut(data.Value, ":")
if !ok {
return
}
groupIndex, err := strconv.ParseInt(group, 10, 64)
if err != nil {
colorlog.Errorf("[%s] get group id err: %v", u.ChatMember.User.String(), err)
return
}
model, after, ok := strings.Cut(after, ":")
if !ok {
return
}
modelIndex, err := strconv.ParseInt(model, 10, 64)
if err != nil {
colorlog.Errorf("[%s] get model id err: %v", u.ChatMember.User.String(), err)
return
}
l := gconfig.Index2ExtraModel(int(groupIndex), int(modelIndex))
model = l.Name
page, err := strconv.ParseInt(after, 10, 64)
if err != nil {
colorlog.Error(err)
return
}
reLora, err := regexp.Compile(fmt.Sprintf("[\\[\\(]*<%s:%s:((?:-?\\d+)(?:\\.\\d+)?)>[\\)\\]]*", l.Type, model))
if err != nil {
colorlog.Error(err)
return
}
var showPreview bool
if err != nil {
cfg.Tag = reLora.ReplaceAllString(cfg.Tag, "")
} else {
if reLora.MatchString(cfg.Tag) {
cfg.Tag = reLora.ReplaceAllString(cfg.Tag, "")
if len(l.TriggerWords) != 0 {
if k, ok := utils.InString(l.TriggerWords[0], getAllTagName(cfg.Tag)); ok {
s := getAllTag(cfg.Tag)
cfg.Tag = strings.Join(append(s[:k], s[k+1:]...), ", ")
}
}
} else {
showPreview = true
if len(l.TriggerWords) != 0 {
if _, ok := utils.InString(l.TriggerWords[0], getAllTagName(cfg.Tag, reDefaultTag)); !ok {
cfg.Tag += fmt.Sprintf(", <lora:%s:0.6>, %s", model, l.TriggerWords[0])
} else {
cfg.Tag += fmt.Sprintf(", <lora:%s:0.6>", model)
}
} else {
cfg.Tag += fmt.Sprintf(", <lora:%s:0.6>", model)
}
}
}
cfg.CorrectCfg(u, true, false, false, false, true)
var msg bytes.Buffer
msg.WriteString(fmt.Sprintf("%s\n<pre># %s</pre>\n", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("extraModelInfo"))))
for k, v := range l.TriggerWords {
msg.WriteString(fmt.Sprintf("\n# <code>%s</code>", parse2HTML(v)))
if k == len(l.TriggerWords)-1 {
msg.WriteByte('\n')
}
}
if showPreview && db.DBType() == db.T_POSTGRESQL {
photo, err := db.FindImg(db.FindConfig{
Deadline: time.Now(),
Order: "id desc",
Limit: 1,
KeywordsRe: []string{fmt.Sprintf("<lora:%s:(-?\\d+)(\\.\\d+)?>", l.Name)},
})
if err == nil && len(photo) == 1 {
msg.WriteString(fmt.Sprintf("\n# <a href=\"https://%s/api/images/%s.png\">Preview</a>", parseflag.HOST, photo[0].FileID))
}
}
tgMsg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, msg.String())
tgMsg.ReplyMarkup = generateExtraModelButton(u, int(page), int(groupIndex), getAllExtraModelName(cfg.Tag, l.Type))
tgMsg.ParseMode = "HTML"
bot.Send(tgMsg)
case "L":
group, after, ok := strings.Cut(data.Value, ":")
if !ok {
return
}
groupIndex, err := strconv.ParseInt(group, 10, 64)
if err != nil {
colorlog.Errorf("[%s] get group id err: %v", u.ChatMember.User.String(), err)
return
}
model, after, ok := strings.Cut(after, ":")
if !ok {
return
}
modelIndex, err := strconv.ParseInt(model, 10, 64)
if err != nil {
colorlog.Errorf("[%s] get model id err: %v", u.ChatMember.User.String(), err)
return
}
l := gconfig.Index2ExtraModel(int(groupIndex), int(modelIndex))
model = l.Name
t, p, found := strings.Cut(after, ":")
if !found {
return
}
page, err := strconv.ParseInt(p, 10, 64)
if err != nil {
colorlog.Error(err)
return
}
reLora, err := regexp.Compile(fmt.Sprintf("[\\[\\(]*<%s:%s:((?:-?\\d+)(?:\\.\\d+)?)>[\\)\\]]*", l.Type, model))
if err != nil {
colorlog.Error(err)
return
}
var showPreview bool
if err != nil {
cfg.Tag = reLora.ReplaceAllString(cfg.Tag, "")
} else {
if s := reLora.FindStringSubmatch(cfg.Tag); len(s) == 2 {
f, err := strconv.ParseFloat(s[1], 64)
if err != nil {
colorlog.Error(err)
return
}
switch t {
case "+":
if f+0.1 > 2 {
return
}
cfg.Tag = reLora.ReplaceAllString(cfg.Tag, fmt.Sprintf("<%s:%s:%.1f>", l.Type, model, f+0.1))
case "-":
if f-0.1 <= 0 {
return
}
cfg.Tag = reLora.ReplaceAllString(cfg.Tag, fmt.Sprintf("<%s:%s:%.1f>", l.Type, model, f-0.1))
}
} else {
showPreview = true
if len(l.TriggerWords) != 0 {
if _, ok := utils.InString(l.TriggerWords[0], getAllTagName(cfg.Tag)); !ok {
cfg.Tag += fmt.Sprintf(", <%s:%s:0.6>, %s", l.Type, model, l.TriggerWords[0])
} else {
cfg.Tag += fmt.Sprintf(", <%s:%s:0.6>", l.Type, model)
}
} else {
cfg.Tag += fmt.Sprintf(", <%s:%s:0.6>", l.Type, model)
}
}
}
cfg.CorrectCfg(u, true, false, false, false, true)
var msg bytes.Buffer
msg.WriteString(fmt.Sprintf("%s\n<pre># %s</pre>\n", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("extraModelInfo"))))
for k, v := range l.TriggerWords {
msg.WriteString(fmt.Sprintf("\n<code># %s</code>", parse2HTML(v)))
if k == len(l.TriggerWords)-1 {
msg.WriteByte('\n')
}
}
if showPreview && db.DBType() == db.T_POSTGRESQL {
photo, err := db.FindImg(db.FindConfig{
Deadline: time.Now(),
Order: "id desc",
Limit: 1,
KeywordsRe: []string{fmt.Sprintf("<%s:%s:(-?\\d+)(\\.\\d+)?>", l.Type, l.Name)},
})
if err == nil && len(photo) == 1 {
msg.WriteString(fmt.Sprintf("\n# <a href=\"https://%s/api/images/%s.png\">Preview</a>", parseflag.HOST, photo[0].FileID))
}
}
tgMsg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, msg.String())
tgMsg.ParseMode = "HTML"
tgMsg.ReplyMarkup = generateExtraModelButton(u, int(page), int(groupIndex), getAllExtraModelName(cfg.Tag, l.Type))
bot.Send(tgMsg)
case "extraModel":
i := strings.LastIndex(data.Value, ":")
group := data.Value[:i]
groupIndex, err := strconv.ParseInt(group, 10, 64)
if err != nil {
colorlog.Errorf("[%s] get group id err: %v", u.ChatMember.User.String(), err)
return
}
page, err := strconv.ParseInt(data.Value[i+1:], 10, 64)
if err != nil {
colorlog.Error(err)
return
}
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("extraModelInfo"))))
msg.ReplyMarkup = generateExtraModelButton(u, int(page), int(groupIndex), getAllExtraModelName(cfg.Tag, `\w+`))
msg.ParseMode = "HTML"
bot.Send(msg)
case "extraModelGroup":
page, err := strconv.ParseInt(data.Value, 10, 64)
if err != nil {
colorlog.Error(err)
return
}
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("extraModelInfo"))))
msg.ReplyMarkup = generateAllExtraModelGroupButton(u, int(page))
msg.ParseMode = "HTML"
bot.Send(msg)
case "resetSeed":
cfg.Seed = uint32(rand.Intn(math.MaxUint32))
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = panelButton(u, len(cfg.PrePhotoID) == 32, len(cfg.ControlPhotoID) == 32)
msg.ParseMode = "HTML"
bot.Send(msg)
case "setImg":
if len(cfg.PrePhotoID) == 32 {
cfg.PrePhotoID = ""
cfg.Strength = 0
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = panelButton(u, false, len(cfg.ControlPhotoID) == 32)
msg.ParseMode = "HTML"
bot.Send(msg)
return
}
m, err := bot.NewMsgCbk(CallbackQuery.Message.Chat.ID, CallbackQuery.From.ID)
if err != nil {
return
}
defer m.Close()
c, err := bot.NewCbk(CallbackQuery.Message.Chat.ID, CallbackQuery.From.ID, CallbackQuery.Message.MessageID)
if err != nil {
return
}
defer c.Close()
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s, %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("setImgInfo")), parse2HTML(u.LoadLang("sendImg"))))
msg.ReplyMarkup = cancelButton(u)
msg.ParseMode = "HTML"
_, err = bot.Send(msg)
if err != nil {
return
}
t := time.NewTimer(time.Minute * 5)
defer t.Stop()
select {
case <-t.C:
break
case <-c.Chan():
break
case msg, ok := <-m.MsgChan():
m.Close()
if !ok {
return
}
var photo []byte
if len(msg.Photo) > 0 {
latestPhoto := msg.Photo[len(msg.Photo)-1]
cfg.Width = latestPhoto.Width
cfg.Height = latestPhoto.Height
photo, err = bot.GetFileData(latestPhoto.FileID)
if err != nil {
colorlog.Errorf("Get photo err: %v", err)
break
}
fi, err := cache.Put(photo)
if err != nil {
colorlog.Errorf("Put file err: %v", err)
break
}
cfg.PrePhotoID = fi.Md5
} else if msg.Document != nil {
if _, ok := utils.InString(msg.Document.MimeType, avilableDocumentType); !ok {
colorlog.Errorf("Get photo err: %s", "document type is not avilable")
break
}
if photo, err = cache.GetFile(utils.GetFileNamePrefix(msg.Document.FileName)); err != nil {
photo, err = bot.GetFileData(msg.Document.FileID)
if err != nil {
colorlog.Errorf("Parse Photo err: %v", err)
break
}
}
cfg.Width, cfg.Height, err = utils.GetPhotoSize(photo)
if err != nil {
colorlog.Errorf("Parse Photo err: %v", err)
break
}
fi, err := cache.Put(photo)
if err != nil {
colorlog.Errorf("Put file err: %v", err)
break
}
cfg.PrePhotoID = fi.Md5
}
}
cfg.Strength = 0.7
msg = tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = panelButton(u, len(cfg.PrePhotoID) == 32, len(cfg.ControlPhotoID) == 32)
msg.ParseMode = "HTML"
bot.Send(msg)
case "setControl":
if len(cfg.ControlPhotoID) == 32 {
cfg.ControlPhotoID = ""
cfg.CorrectCfg(u, false, false, false, false, true)
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = panelButton(u, false, len(cfg.ControlPhotoID) == 32)
msg.ParseMode = "HTML"
bot.Send(msg)
return
}
m, err := bot.NewMsgCbk(CallbackQuery.Message.Chat.ID, CallbackQuery.From.ID)
if err != nil {
return
}
defer m.Close()
c, err := bot.NewCbk(CallbackQuery.Message.Chat.ID, CallbackQuery.From.ID, CallbackQuery.Message.MessageID)
if err != nil {
return
}
defer c.Close()
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s, %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("setImgInfo")), parse2HTML(u.LoadLang("sendImg"))))
msg.ReplyMarkup = cancelButton(u)
msg.ParseMode = "HTML"
_, err = bot.Send(msg)
if err != nil {
return
}
t := time.NewTimer(time.Minute * 5)
defer t.Stop()
select {
case <-t.C:
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = panelButton(u, len(cfg.PrePhotoID) == 32, len(cfg.ControlPhotoID) == 32)
msg.ParseMode = "HTML"
bot.Send(msg)
return
case <-c.Chan():
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = panelButton(u, len(cfg.PrePhotoID) == 32, len(cfg.ControlPhotoID) == 32)
msg.ParseMode = "HTML"
bot.Send(msg)
return
case msg, ok := <-m.MsgChan():
m.Close()
if !ok {
return
}
var photo []byte
if len(msg.Photo) > 0 {
latestPhoto := msg.Photo[len(msg.Photo)-1]
photo, err = bot.GetFileData(latestPhoto.FileID)
if err != nil {
colorlog.Errorf("Get photo err: %v", err)
break
}
fi, err := cache.Put(photo)
if err != nil {
colorlog.Errorf("Put file err: %v", err)
break
}
cfg.ControlPhotoID = fi.Md5
} else if msg.Document != nil {
if _, ok := utils.InString(msg.Document.MimeType, avilableDocumentType); !ok {
colorlog.Errorf("Get photo err: %s", "document type is not avilable")
break
}
if photo, err = cache.GetFile(utils.GetFileNamePrefix(msg.Document.FileName)); err != nil {
photo, err = bot.GetFileData(msg.Document.FileID)
if err != nil {
colorlog.Errorf("Parse Photo err: %v", err)
break
}
}
var fi cache.FileInfo
fi, err = cache.Put(photo)
if err != nil {
colorlog.Errorf("Put file err: %v", err)
break
}
cfg.ControlPhotoID = fi.Md5
} else {
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = panelButton(u, len(cfg.PrePhotoID) == 32, len(cfg.ControlPhotoID) == 32)
msg.ParseMode = "HTML"
bot.Send(msg)
return
}
if len(cfg.PrePhotoID) != 32 {
width, hight, err := utils.GetPhotoSize(photo)
if err != nil {
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = panelButton(u, len(cfg.PrePhotoID) == 32, len(cfg.ControlPhotoID) == 32)
msg.ParseMode = "HTML"
bot.Send(msg)
return
}
cfg.Width = width
cfg.Height = hight
}
}
cfg.CorrectCfg(u, false, false, false, false, true)
msg = tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = editControlButton(u)
msg.ParseMode = "HTML"
bot.Send(msg)
case "editControl":
bot.Send(tgbotapi.NewEditMessageReplyMarkup(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, *editControlButton(u)))
case "controlPreprocess":
bot.Send(tgbotapi.NewEditMessageReplyMarkup(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, *controlPreprocessButton(u, cfg.ControlPreprocess)))
case "controlProcess":
bot.Send(tgbotapi.NewEditMessageReplyMarkup(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, *controlProcessButton(cfg.ControlProcess)))
case "preprocess":
cfg.ControlPreprocess = data.Value
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = editControlButton(u)
msg.ParseMode = "HTML"
bot.Send(msg)
case "process":
cfg.ControlProcess = data.Value
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = editControlButton(u)
msg.ParseMode = "HTML"
bot.Send(msg)
case "confirm":
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = panelButton(u, len(cfg.PrePhotoID) == 32, len(cfg.ControlPhotoID) == 32)
msg.ParseMode = "HTML"
bot.Send(msg)
case "sizeType":
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(fmt.Sprintf("%d * %d = %d (Min: H*W>=64*64, Max: H*W<= %d [Unsponsored maximum Size is %d])", cfg.Width, cfg.Height, cfg.Width*cfg.Height, parseflag.ImgMaxSize, GuestImgMaxSize))))
msg.ParseMode = "HTML"
switch data.Value {
case "16:9":
msg.ReplyMarkup = generate16_9Button(u, fmt.Sprint(cfg.Width, "*", cfg.Height))
case "9:16":
msg.ReplyMarkup = generate9_16Button(u, fmt.Sprint(cfg.Width, "*", cfg.Height))
case "4:3":
msg.ReplyMarkup = generate4_3Button(u, fmt.Sprint(cfg.Width, "*", cfg.Height))
case "3:4":
msg.ReplyMarkup = generate3_4Button(u, fmt.Sprint(cfg.Width, "*", cfg.Height))
case "1:1":
msg.ReplyMarkup = generate1_1Button(u, fmt.Sprint(cfg.Width, "*", cfg.Height))
case "2:3":
msg.ReplyMarkup = generate2_3Button(u, fmt.Sprint(cfg.Width, "*", cfg.Height))
case "3:2":
msg.ReplyMarkup = generate3_2Button(u, fmt.Sprint(cfg.Width, "*", cfg.Height))
case "custom":
msg.ReplyMarkup = custonSizeButton(u)
}
bot.Send(msg)
case "custonSize":
i, err := strconv.ParseInt(data.Value[2:], 10, 64)
if err != nil {
colorlog.Error(err)
return
}
switch data.Value[:2] {
case "w-":
if cfg.Width-int(i) >= 64 {
cfg.Width -= int(i)
} else {
cfg.Width = 64
}
case "w+":
if (cfg.Width+int(i))*cfg.Height <= parseflag.ImgMaxSize {
cfg.Width += int(i)
}
case "h-":
if cfg.Height-int(i) >= 64 {
cfg.Height -= int(i)
} else {
cfg.Height = 64
}
case "h+":
if (cfg.Height+int(i))*cfg.Width <= parseflag.ImgMaxSize {
cfg.Height += int(i)
}
}
cfg.CorrectCfg(u, false, false, false, false, true)
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(fmt.Sprintf("%d * %d = %d (Min: H*W>=64*64, Max: H*W<= %d [Unsponsored maximum Size is %d])", cfg.Width, cfg.Height, cfg.Width*cfg.Height, parseflag.ImgMaxSize, GuestImgMaxSize))))
msg.ReplyMarkup = custonSizeButton(u)
msg.ParseMode = "HTML"
bot.Send(msg)
case "size":
Width, Height, f := strings.Cut(data.Value, "*")
if f {
w, err := strconv.ParseInt(Width, 10, 64)
if err == nil {
cfg.Width = int(w)
}
h, err := strconv.ParseInt(Height, 10, 64)
if err == nil {
cfg.Height = int(h)
}
}
cfg.CorrectCfg(u, false, false, false, false, true)
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = panelButton(u, len(cfg.PrePhotoID) == 32, len(cfg.ControlPhotoID) == 32)
msg.ParseMode = "HTML"
bot.Send(msg)
case "num":
i, err := strconv.ParseInt(data.Value, 10, 64)
if err != nil {
return
}
cfg.Num = int(i)
cfg.CorrectCfg(u, false, false, false, false, false)
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = panelButton(u, len(cfg.PrePhotoID) == 32, len(cfg.ControlPhotoID) == 32)
msg.ParseMode = "HTML"
bot.Send(msg)
case "mode":
cfg.Mode = data.Value
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = panelButton(u, len(cfg.PrePhotoID) == 32, len(cfg.ControlPhotoID) == 32)
msg.ParseMode = "HTML"
bot.Send(msg)
case "strength":
switch data.Value[:1] {
case "+":
f, err := strconv.ParseFloat(data.Value[1:], 32)
if err != nil {
colorlog.Error(err)
return
}
if cfg.Strength+float64(f) <= 0.99 {
cfg.Strength += float64(f)
} else {
cfg.Strength = 0.99
}
cfg.Strength = utils.TwoDot(cfg.Strength)
case "-":
f, err := strconv.ParseFloat(data.Value[1:], 32)
if err != nil {
colorlog.Error(err)
return
}
if cfg.Strength-float64(f) > 0 {
cfg.Strength -= float64(f)
} else {
cfg.Strength = 0
}
cfg.Strength = utils.TwoDot(cfg.Strength)
}
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("strengthInfo"))))
msg.ReplyMarkup = strengthButton(u)
msg.ParseMode = "HTML"
bot.Send(msg)
case "scale":
v, err := strconv.ParseInt(data.Value[1:], 10, 64)
if err != nil {
return
}
switch data.Value[:1] {
case "+":
if cfg.CfgScale+int(v) <= 30 {
cfg.CfgScale += int(v)
} else {
cfg.CfgScale = 30
}
case "-":
if cfg.CfgScale-int(v) >= 1 {
cfg.CfgScale -= int(v)
} else {
cfg.CfgScale = 1
}
}
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("scaleInfo"))))
msg.ReplyMarkup = scaleButton(u)
msg.ParseMode = "HTML"
bot.Send(msg)
case "model":
cfg.Model = data.Value
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = panelButton(u, len(cfg.PrePhotoID) == 32, len(cfg.ControlPhotoID) == 32)
msg.ParseMode = "HTML"
bot.Send(msg)
case "steps":
v, err := strconv.ParseInt(data.Value[1:], 10, 64)
if err != nil {
return
}
switch data.Value[:1] {
case "-":
if cfg.Steps-int(v) >= 15 {
cfg.Steps -= int(v)
} else {
cfg.Steps = 15
}
case "+":
if cfg.Steps+int(v) <= 50 {
cfg.Steps += int(v)
} else {
cfg.Steps = 50
}
}
cfg.CorrectCfg(u, false, false, false, false, true)
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("stepsInfo")), parse2HTML("(Min: 15, Max: 50 [Unsponsored maximum Steps is 28])")))
msg.ReplyMarkup = stepsButton(u)
msg.ParseMode = "HTML"
bot.Send(msg)
case "cancel":
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = panelButton(u, len(cfg.PrePhotoID) == 32, len(cfg.ControlPhotoID) == 32)
msg.ParseMode = "HTML"
bot.Send(msg)
}
}
func panel(bot *tgbotapi.BotAPI, CallbackQuery *tgbotapi.CallbackQuery, data *tgbotapi.ChanData, u *user.UserInfo) {
cfg := &Config{}
err := yaml.Unmarshal([]byte(CallbackQuery.Message.Text), cfg)
if err != nil {
colorlog.Error(err)
return
}
switch data.Value {
case "confirm":
task, err := u.AddTask(user.T_Draw)
if err != nil {
return
}
defer task.Down()
cfg.CorrectCfg(u, true, true, false, false, true)
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, string(cfg.Fomate2TgHTML()))
msg.ReplyMarkup = reDrawButton(u)
msg.ParseMode = "HTML"
bot.Send(msg)
photo, err := cache.GetFile(cfg.PrePhotoID)
if err != nil {
colorlog.Error(err)
return
}
controlPhoto, err := cache.GetFile(cfg.ControlPhotoID)
if err != nil {
colorlog.Error(err)
return
}
drawAndSend(bot, u, CallbackQuery.Message.MessageID, cfg, photo, controlPhoto, false)
return
case "size":
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(fmt.Sprintf("%d * %d = %d (Min: H*W>=64*64, Max: H*W<= %d [Unsponsored maximum Size is %d])", cfg.Width, cfg.Height, cfg.Width*cfg.Height, parseflag.ImgMaxSize, GuestImgMaxSize))))
msg.ReplyMarkup = sizeTypeButton(u)
msg.ParseMode = "HTML"
bot.Send(msg)
case "num":
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("freeMaxNum"))))
msg.ReplyMarkup = generateNUMButton(cfg.Num)
msg.ParseMode = "HTML"
bot.Send(msg)
case "mode":
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("modeInfo"))))
msg.ReplyMarkup = generateMODEButton(cfg.Mode)
msg.ParseMode = "HTML"
bot.Send(msg)
case "strength":
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("strengthInfo"))))
msg.ReplyMarkup = strengthButton(u)
msg.ParseMode = "HTML"
bot.Send(msg)
case "scale":
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("scaleInfo"))))
msg.ReplyMarkup = scaleButton(u)
msg.ParseMode = "HTML"
bot.Send(msg)
case "model":
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("modelInfo"))))
msg.ReplyMarkup = generateModelButton(cfg.Model)
msg.ParseMode = "HTML"
bot.Send(msg)
case "steps":
msg := tgbotapi.NewEditMessageText(CallbackQuery.Message.Chat.ID, CallbackQuery.Message.MessageID, fmt.Sprintf("%s\n<pre># %s %s</pre>", cfg.Fomate2TgHTML(), parse2HTML(u.LoadLang("stepsInfo")), parse2HTML("(Min: 15, Max: 50 [Unsponsored maximum Steps is 28])")))
msg.ReplyMarkup = stepsButton(u)
msg.ParseMode = "HTML"
bot.Send(msg)
}
}
func superResolution(bot *tgbotapi.BotAPI, CallbackQuery *tgbotapi.CallbackQuery, data *tgbotapi.ChanData, u *user.UserInfo) {
if u.Permissions() == user.T_Prohibit {
msg := tgbotapi.NewMessage(u.ChatMember.User.ID, u.ProhibitString(bot))
msg.ReplyMarkup = goJoinButton(u)
msg.ReplyToMessageID = CallbackQuery.Message.MessageID
bot.Send(msg)
return
}
if CallbackQuery.Message.Document == nil || CallbackQuery.Message.Document.FileID == "" {
return
}
task, err := u.AddTask(user.T_SuperResolution)
if err != nil {
return
}
defer task.Down()
resize, err := strconv.ParseInt(data.Value, 10, 64)
if err != nil {
return
}
cfg := new(Config)
md5 := utils.GetFileNamePrefix(CallbackQuery.Message.Document.FileName)
var prePhoto []byte
prePhoto, err = cache.GetFile(md5)
if err != nil {
prePhoto, err = bot.GetFileData(CallbackQuery.Message.Document.FileID)
if err != nil {
colorlog.Error(err)
return
}
_, err := cache.Put(prePhoto)
if err != nil {
colorlog.Errorf("Put file err: %v", err)
}
}
cfg.DrawConfig = api.DrawConfig{}
cfg.PrePhotoID = md5
cfg.Width, cfg.Height, err = utils.GetPhotoSize(prePhoto)
if err != nil {
colorlog.Error(err)
return
}
superResolutionRun(bot, u, CallbackQuery.Message.MessageID, cfg, prePhoto, int(resize))
}
func fineTune(bot *tgbotapi.BotAPI, CallbackQuery *tgbotapi.CallbackQuery, Strings string, u *user.UserInfo) {
if u.Permissions() == user.T_Prohibit {
msg := tgbotapi.NewMessage(u.ChatMember.User.ID, u.ProhibitString(bot))
msg.ReplyMarkup = goJoinButton(u)
msg.ReplyToMessageID = CallbackQuery.Message.MessageID
bot.Send(msg)
return
}
if CallbackQuery.Message.Document == nil || CallbackQuery.Message.Document.FileID == "" {
return
}
task, err := u.AddTask(user.T_Draw)
if err != nil {
return
}
defer task.Down()
cfg := new(Config)
fileID := utils.GetFileNamePrefix(CallbackQuery.Message.Document.FileName)
var prePhoto []byte
prePhoto, err = cache.GetFile(fileID)
if err != nil {
prePhoto, err = bot.GetFileData(CallbackQuery.Message.Document.FileID)
if err != nil {
colorlog.Error(err)
return
}
_, err := cache.Put(prePhoto)
if err != nil {
colorlog.Errorf("Put file err: %v", err)
}
}
config, err := api.GetImgCfg(prePhoto)
if err != nil {
colorlog.Error(err)
return
}
cfg.DrawConfig = *config
cfg.Mode = "DDIM"
if u.Permissions() == user.T_Subscribe {
cfg.Steps = 50
} else {
cfg.Steps = 28
}
cfg.Num = 2
cfg.PrePhotoID = fileID
if Strings == "1" {
cfg.Strength = 0.2
} else if Strings == "2" {
cfg.Strength = 0.4
} else {
cfg.Strength = 0.6
}
cfg.Seed = 0
cfg.CorrectCfg(u, false, false, false, false, true)
drawAndSend(bot, u, CallbackQuery.Message.MessageID, cfg, prePhoto, nil, false)
}
func reDraw(bot *tgbotapi.BotAPI, CallbackQuery *tgbotapi.CallbackQuery, u *user.UserInfo) {
if u.Permissions() == user.T_Prohibit {
msg := tgbotapi.NewMessage(u.ChatMember.User.ID, u.ProhibitString(bot))
msg.ReplyMarkup = goJoinButton(u)
msg.ReplyToMessageID = CallbackQuery.Message.MessageID
bot.Send(msg)
return
}
task, err := u.AddTask(user.T_Draw)
if err != nil {
return
}
defer task.Down()
cfg := &Config{}
if yaml.Unmarshal([]byte(CallbackQuery.Message.Text), cfg) == nil {
var prePhoto []byte
if len(cfg.PrePhotoID) == 32 {
prePhoto, err = cache.GetFile(cfg.PrePhotoID)
if err != nil {
colorlog.Error(err)
return
}
}
var controlPhoto []byte
if len(cfg.ControlPhotoID) == 32 {
controlPhoto, err = cache.GetFile(cfg.ControlPhotoID)
if err != nil {
colorlog.Error(err)
return
}
}
cfg.Seed = 0
cfg.CorrectCfg(u, false, false, false, false, true)
mc := tgbotapi.NewMessage(u.ChatMember.User.ID, string(cfg.Fomate2TgHTML()))
mc.ReplyMarkup = reDrawButton(u)
mc.ParseMode = "HTML"
mc.ReplyToMessageID = CallbackQuery.Message.MessageID
m, err := bot.Send(mc)
if err != nil {
colorlog.Error(err)
return
}
drawAndSend(bot, u, m.MessageID, cfg, prePhoto, controlPhoto, false)
}
}