Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New -d for debug/seeing all parentheses and use newer grol 0.58 with simplified expressions output, fixed @grol -f in channels. #90

Merged
merged 3 commits into from
Aug 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 47 additions & 54 deletions bot.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,25 @@ func updateMap(msgID, replyID string) {
}
}

func setFormatMode(session *discordgo.Session, message *discordgo.Message, p *CommandParams) {
message.Content = tagToCmd(message.Content, session.State.User.ID)
p.formatMode = strings.HasPrefix(message.Content, formatModeStr)
p.compactMode = strings.HasPrefix(message.Content, compactModeStr)
p.verbatimMode = strings.HasPrefix(message.Content, verbatimModeStr)
p.debugParenMode = strings.HasPrefix(message.Content, debugParenStr)
switch {
case p.formatMode:
message.Content = message.Content[len(formatModeStr):]
case p.compactMode:
message.Content = message.Content[len(compactModeStr):]
case p.verbatimMode:
message.Content = message.Content[len(verbatimModeStr):]
case p.debugParenMode:
message.Content = message.Content[len(debugParenStr):]
}
message.Content = strings.TrimPrefix(message.Content, grolPrefix)
}

func handleDM(session *discordgo.Session, message *discordgo.Message, replyID string) {
log.S(log.Info, "direct-message",
log.Any("from", message.Author.Username),
Expand All @@ -96,32 +115,15 @@ func handleDM(session *discordgo.Session, message *discordgo.Message, replyID st
log.S(log.Warning, "ignoring bot message", log.Any("message", message))
return
}
message.Content = tagToCmd(message.Content, session.State.User.ID)
formatMode := strings.HasPrefix(message.Content, formatModeStr)
compactMode := strings.HasPrefix(message.Content, compactModeStr)
verbatimMode := strings.HasPrefix(message.Content, verbatimModeStr)
var what string
switch {
case formatMode:
what = strings.TrimPrefix(message.Content, formatModeStr)
case compactMode:
what = strings.TrimPrefix(message.Content, compactModeStr)
case verbatimMode:
what = strings.TrimPrefix(message.Content, verbatimModeStr)
default:
what = strings.TrimPrefix(message.Content, grolPrefix)
}
p := &CommandParams{
session: session,
message: message,
channelID: message.ChannelID,
replyID: replyID,
formatMode: formatMode,
compactMode: compactMode,
verbatimMode: verbatimMode,
useReply: false,
}
replyID = evalAndReply(session, "dm-reply", what, p)
session: session,
message: message,
channelID: message.ChannelID,
replyID: replyID,
useReply: false,
}
setFormatMode(session, message, p)
replyID = evalAndReply(session, "dm-reply", message.Content, p)
updateMap(message.ID, replyID)
}

Expand All @@ -131,6 +133,7 @@ var (
formatModeStr = grolPrefix + " -f"
compactModeStr = grolPrefix + " -c"
verbatimModeStr = grolPrefix + " -v"
debugParenStr = grolPrefix + " -d"
)

func RemoveTripleBackticks(s string) string {
Expand Down Expand Up @@ -234,8 +237,10 @@ func evalInput(input string, p *CommandParams) string {
case "", "help", "-h", "--help", "-help":
res = "💡 Grol bot help: grol bot evaluates [grol](<https://grol.io>) language fragments, as simple as expressions like `1+1`" +
" and as complex as defining closures, using map, arrays, etc... the syntax is similar to go (without needing " +
"`:=`, plain `=` is enough). Use `info` to see all functions, keywords, etc...\n\n" +
"Either in DM or @grol or with `!grol` prefix (or `!grol -f` for also showing formatted code, `-c` in compact mode)" +
"`:=`, plain `=` is enough). Use `info` to see all functions, keywords, etc..." +
" Try `TicTacToe()` for more advanced example that includes grol handling discord interactions and complex messages.\n\n" +
"Either in DM or @grol or with `!grol` prefix (or `!grol -f` for also showing formatted code, `-c` in compact mode," +
" `-d` debug expressions)" +
" in a channel, you can type any grol code and the bot will evaluate it (only code blocks if there are any).\n\n" +
"Also supported `!grol version`, `!grol source`, `!grol buildinfo`, `!grol bug`.\n\n" +
"You can also try the /grol command, answers will be visible only to you!"
Expand All @@ -261,6 +266,7 @@ func evalInput(input string, p *CommandParams) string {
input = RemoveTripleBackticks(input)
cfg := replConfig()
cfg.Compact = p.compactMode
cfg.AllParens = p.debugParenMode
cfg.PreInput = func(state *eval.State) {
st := MessageState{
Session: p.session,
Expand All @@ -273,11 +279,14 @@ func evalInput(input string, p *CommandParams) string {
// Turn smart quotes back into regular quotes - https://github.com/grol-io/grol-discord-bot/issues/57
input = SmartQuotesToRegular(input)
evalres, errs, formatted := repl.EvalStringWithOption(cfg, input)
if (p.formatMode || p.compactMode) && formatted != "" {
if (p.formatMode || p.compactMode || p.debugParenMode) && formatted != "" {
res = formatModeStr
if p.compactMode {
res = compactModeStr
}
if p.debugParenMode {
res = debugParenStr
}
res += "\n```go\n" + formatted + "``` produces: "
}
evalres = strings.TrimSpace(evalres)
Expand Down Expand Up @@ -324,7 +333,7 @@ type CommandParams struct {
// If we already replied and have an ID of that reply (to edit it).
replyID string
// Formatting options. useReply selects if we should use reply (in channel) or send (DMs).
formatMode, compactMode, verbatimMode, useReply, hasErrors bool
formatMode, compactMode, debugParenMode, verbatimMode, useReply, hasErrors bool
}

// returns the id of the reply.
Expand Down Expand Up @@ -442,41 +451,25 @@ func handleMessage(session *discordgo.Session, message *discordgo.Message, reply
}
return
}
formatMode := strings.HasPrefix(message.Content, formatModeStr)
compactMode := strings.HasPrefix(message.Content, compactModeStr)
verbatimMode := strings.HasPrefix(message.Content, verbatimModeStr)
var content string
switch {
case formatMode:
content = message.Content[len(formatModeStr):]
case compactMode:
content = message.Content[len(compactModeStr):]
case verbatimMode:
content = message.Content[len(verbatimModeStr):]
default:
content = message.Content[len(grolPrefix):]
p := &CommandParams{
session: session,
message: message,
channelID: message.ChannelID,
replyID: replyID,
useReply: true,
}
setFormatMode(session, message, p)
log.S(log.Info, info,
log.Any("from", message.Author.Username),
log.Any("server", serverName),
log.Any("channel", channelName),
log.Any("content", message.Content),
log.Bool("format", formatMode))
log.Bool("format", p.formatMode))
if message.Author.Bot {
log.S(log.Warning, "ignoring bot message", log.Any("message", message))
return
}
p := &CommandParams{
session: session,
message: message,
channelID: message.ChannelID,
replyID: replyID,
formatMode: formatMode,
compactMode: compactMode,
verbatimMode: verbatimMode,
useReply: true,
}
replyID = evalAndReply(session, "channel-response", content, p)
replyID = evalAndReply(session, "channel-response", message.Content, p)
updateMap(message.ID, replyID)
}

Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ require (
fortio.org/scli v1.15.2
fortio.org/version v1.0.4
github.com/bwmarrin/discordgo v0.28.1
grol.io/grol v0.57.0
grol.io/grol v0.58.0
)

// replace grol.io/grol => ../grol
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,5 @@ golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
grol.io/grol v0.57.0 h1:KcvYvj8pS8NWTYH7lDCylwBKcBvimwZCkBGkBr3RYd0=
grol.io/grol v0.57.0/go.mod h1:auvyNPGD+C1jMFsu+EkAVmXCjweP9qRLoTIYtdfrWiI=
grol.io/grol v0.58.0 h1:fheZ1Z8ZShM4LPwdcqpIkdH/FOJ8Osc1UPh16ZNph3c=
grol.io/grol v0.58.0/go.mod h1:auvyNPGD+C1jMFsu+EkAVmXCjweP9qRLoTIYtdfrWiI=