Add mol command and pubchem searching
This commit is contained in:
62
commands/mol.go
Normal file
62
commands/mol.go
Normal file
@ -0,0 +1,62 @@
|
||||
package commands
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
|
||||
)
|
||||
|
||||
type MolCommand struct{}
|
||||
|
||||
func (m MolCommand) Name() string {
|
||||
return "mol"
|
||||
}
|
||||
|
||||
func (m MolCommand) Help() string {
|
||||
return "2D molecular structure. Example usage: /mol tetraethylgermane"
|
||||
}
|
||||
|
||||
func (m MolCommand) Execute(update tgbotapi.Update, bot *tgbotapi.BotAPI) {
|
||||
args := strings.TrimSpace(update.Message.CommandArguments())
|
||||
if args == "" {
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Input a molecule name dumbass")
|
||||
bot.Send(msg)
|
||||
return
|
||||
}
|
||||
cid, err := fetchPubchemCID(args)
|
||||
if err != nil {
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Structure not found")
|
||||
bot.Send(msg)
|
||||
return
|
||||
}
|
||||
imgURL := fmt.Sprintf("https://pubchem.ncbi.nlm.nih.gov/image/imgsrv.fcgi?t=l&cid=%s", cid)
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, imgURL)
|
||||
bot.Send(msg)
|
||||
}
|
||||
|
||||
func fetchPubchemCID(compound string) (string, error) {
|
||||
url := "https://pubchem.ncbi.nlm.nih.gov/compound/" + compound
|
||||
resp, err := http.Get(url)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
re := regexp.MustCompile(`<meta name="pubchem_uid_value" content="(\d+)"/?>`)
|
||||
matches := re.FindStringSubmatch(string(body))
|
||||
if len(matches) < 2 {
|
||||
return "", fmt.Errorf("CID not found")
|
||||
}
|
||||
return matches[1], nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
Register(MolCommand{})
|
||||
}
|
Reference in New Issue
Block a user