Compare commits

..

27 Commits

Author SHA1 Message Date
a355447dc6 fix 2023-10-13 00:02:12 +00:00
a7e87335b1 fix: remove invalid erase on price 2023-10-12 23:55:36 +00:00
5cf17d64f9 merge file by feature 2023-10-12 12:32:06 +00:00
575979c497 opti: price and quantity is now store in string 2023-10-11 20:06:28 +00:00
9bf46c857c fix: dockerfile clone dir 2023-10-11 19:33:55 +00:00
2f1089976c use env var in dockerfile 2023-10-11 19:01:11 +00:00
75fbd17761 clean: split code 2023-10-11 18:59:32 +00:00
fceef8197b add: token in env var 2023-10-11 18:59:09 +00:00
74024e696a add: get token in env var 2023-10-11 18:58:50 +00:00
cb5ad765a1 clean 2023-10-11 18:58:22 +00:00
62c7107233 clean: remove debug print 2023-10-11 18:13:18 +00:00
6b0f99d5ad add: quantity and price 2023-10-11 17:34:20 +00:00
493c3ef47d add: pragma once to config.h 2023-10-11 15:24:29 +00:00
dd5d35d043 update gitignore 2023-10-11 13:52:53 +00:00
7b59355a3c add: set token into args 2023-10-11 13:52:42 +00:00
a9eeef17d7 fix: don't remove message on check mark on all
channel
2023-10-11 12:12:40 +00:00
d9f23b544a ds 2023-10-10 14:24:58 +00:00
154148220e update readme docker installation 2023-10-10 14:12:45 +00:00
684057a2c5 fix: dockerfile get . file 2023-10-10 14:04:23 +00:00
de2400cdf2 add: dockerfile 2023-10-10 13:43:47 +00:00
059de4981c add: readme 2023-10-10 13:19:57 +00:00
ed73e9db37 remove price and quantity and print the embed 2023-10-10 12:50:19 +00:00
e398c3c6cb ignore config to hide Bot token 2023-10-10 12:45:08 +00:00
bdc7caf1b3 add: config file and verif category name 2023-10-10 12:42:28 +00:00
9f83b5baea fix: double print message 2023-10-07 23:23:45 +00:00
349cb03844 init: dockerfile 2023-10-07 23:21:50 +00:00
df5f8c3227 add: delete button 2023-10-07 23:21:42 +00:00
10 changed files with 270 additions and 29 deletions

4
.gitignore vendored
View File

@ -1,2 +1,4 @@
obj/*
PyMenu
PyMenu
src/config.h
core

26
Dockerfile Normal file
View File

@ -0,0 +1,26 @@
FROM debian
RUN apt update
RUN yes y | apt upgrade
RUN apt install make
RUN yes y | apt install git
RUN yes | apt install wget
RUN yes y | apt install g++
# install the dpp lib
RUN yes y | apt install cmake
RUN yes y | apt install libsodium23
RUN yes y | apt install libopus0
RUN wget -O dpp.deb https://dl.dpp.dev/
RUN dpkg -i dpp.deb
RUN mkdir /app
RUN git clone https://git.chauvet.pro/starnakin/PyMenuBOT /app
WORKDIR /app
RUN make
ENTRYPOINT ["./PyMenu"]

67
README.md Normal file
View File

@ -0,0 +1,67 @@
# PyMenu
PyMenu is a discord bot to create grocery list
## Feature
- Add items to your list by sending a message to a channel within the `GROCERY_LIST` category.
- Support for multiple lists, one for each channel.
- Easily remove items from your list by clicking on the check mark reaction.
- Set prices for items.
- Specify quantities for items.
## Screenshots
![](https://media.discordapp.net/attachments/501841539161522176/1161285342914170970/image.png?ex=6537be41&is=65254941&hm=3ace3096fd0a5d66cb8bfc8c744dbd79dcba84fc02cbaf7a02b01ffbcc7ed58d&=)
## Planned feature
- Customize the category name.
- Add images.
- Implement statistics for nerd
## Requirements
- make
- g++
- [DPP](https://dpp.dev)
## Installation
- install `make`
- install `g++`
- [install dpp and its dependencies](https://dpp.dev/installing.html)
- Clone the project:
``` bash
git clone https://git.chauvet.pro/starnakin/PyMenuBOT/
cd PyMenuBOT
```
- Compile the project:
``` bash
make
```
- Launch the executable:
``` bash
./PyMenu
```
## Installation - Docker
- Clone the project:
``` bash
git clone https://git.chauvet.pro/starnakin/PyMenuBOT/
cd PyMenuBOT
```
- Build the docker image.
``` bash
docker build -t pymenu .
```
- Config the bot
Edit the `docker-compose.yml` file and set the discord bot token
- Run the docker
```bash
docker-compose up -d
```
- Run the docker - alternative without docker-compose
```bash
docker run --restart=always --name=pymenu -e BOT_TOKEN=token -d pymenu
```
## Setting up on Your Discord Server
- Add the bot to your server (using [the official instance](https://discord.com/oauth2/authorize?client_id=818558187443716137&scope=bot+applications.commands&permissions=10737428544))
- Create a category called `listes-de-course`
- Inside this category, create channels for each of your grocery lists (e.g., `Wallmart`).
- You can now start adding items to your lists by sending messages in the respective channels.

9
docker-compose.yml Normal file
View File

@ -0,0 +1,9 @@
version: "3"
services:
pymenu:
container_name: pymenu
image: pymenu
build: .
restart: always
environment:
- BOT_TOKEN=TOKEN

5
src/config.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include <string>
const std::string BOT_TOKEN = "token";
const std::string GROCERY_LIST_CATEGORY = "listes-de-course";

70
src/grocery.cpp Normal file
View File

@ -0,0 +1,70 @@
#include <dpp/cluster.h>
#include <dpp/unicode_emoji.h>
#include <dpp/dpp.h>
#include <string>
#include "config.h"
#include "utils.hpp"
void on_message(dpp::cluster& bot)
{
bot.on_message_create([&bot](const dpp::message_create_t& event)
{
if (event.msg.author.id == bot.me.id)
{
bot.message_add_reaction(event.msg, dpp::unicode_emoji::white_check_mark);
}
else
{
dpp::channel channel = bot.channel_get_sync(event.msg.channel_id);
dpp::channel category = bot.channel_get_sync(channel.parent_id);
if (category.is_category() == false || category.name != GROCERY_LIST_CATEGORY)
return;
dpp::embed embed = dpp::embed()
.set_color(dpp::colors::sea_green)
.set_title(event.msg.content)
.set_author(event.msg.author.username, "", "")
.set_footer(dpp::embed_footer().set_text("PyMenuVersion:2.0"));
std::string str = event.msg.content;
std::string quantity, price;
get_article_data(str, quantity, price);
if (!quantity.empty())
embed.add_field("Quantity", quantity);
if (!price.empty())
embed.add_field("Price", price);
embed.set_title(str);
dpp::message msg(event.msg.channel_id, embed);
event.send(msg);
bot.message_delete(event.msg.id, event.msg.channel_id);
}
});
}
void on_react(dpp::cluster& bot)
{
bot.on_message_reaction_add([&bot](const dpp::message_reaction_add_t& event)
{
dpp::channel channel = bot.channel_get_sync(event.channel_id);
dpp::channel category = bot.channel_get_sync(channel.parent_id);
if (category.is_category() == false || category.name != GROCERY_LIST_CATEGORY)
return;
if (event.reacting_user.id == bot.me.id)
return;
dpp::emoji emoji = event.reacting_emoji;
if (emoji.name == dpp::unicode_emoji::white_check_mark)
bot.message_delete(event.message_id, event.channel_id);
});
}

View File

@ -1,39 +1,19 @@
#include <string>
#include <dpp/dpp.h>
#include <dpp/unicode_emoji.h>
#include <dpp/channel.h>
const std::string BOT_TOKEN = "NDkyOTgxMzcwMDg0MzkyOTYw.GAaPMf.LvxTvRkd7pMozkTxC3miWnqM5g7SwxLz2iGVPo";
#include "utils.hpp"
#include "pymenu.hpp"
int main()
int main(int ac, char **av, char** env)
{
dpp::cluster bot(BOT_TOKEN, dpp::i_default_intents | dpp::i_message_content);
(void) ac;
dpp::cluster bot(get_token(av, env), dpp::i_default_intents | dpp::i_message_content);
bot.on_log(dpp::utility::cout_logger());
bot.on_message_create([&bot](const dpp::message_create_t& event)
{
if (event.msg.author.id == bot.me.id)
{
bot.message_add_reaction(event.msg, dpp::unicode_emoji::x);
bot.message_add_reaction(event.msg, dpp::unicode_emoji::white_check_mark);
}
else
{
dpp::embed embed = dpp::embed()
.set_color(dpp::colors::sea_green)
.set_title(event.msg.content)
.add_field("Quantite", "1", true)
.add_field("Prix", "3.29")
.set_author(event.msg.author.username, "", "")
.set_footer(dpp::embed_footer().set_text("PyMenuVersion:2.0"));
bot.message_delete(event.msg.id, event.msg.channel_id);
dpp::message msg(event.msg.channel_id, embed);
event.send(msg);
}
});
on_react(bot);
on_message(bot);
bot.on_ready([&bot](const dpp::ready_t& event)
{

6
src/pymenu.hpp Normal file
View File

@ -0,0 +1,6 @@
#pragma once
#include <dpp/cluster.h>
void on_react(dpp::cluster& bot);
void on_message(dpp::cluster& bot);

70
src/utils.cpp Normal file
View File

@ -0,0 +1,70 @@
#include <cctype>
#include <cstddef>
#include <cstring>
#include <string>
#include <iostream>
#include "config.h"
static std::string get_price(std::string& str)
{
std::string price;
size_t i;
for (i = 0; i != str.size(); i++)
{
if (std::strcmp(str.substr(i, 3).c_str(), "") == 0)
{
if (price.empty())
{
price = "";
continue;
}
price += "";
str.erase(i - (price.size() - 3), price.size());
return price;
}
else if (std::isdigit(str[i]) || str[i] == '.')
price += str[i];
}
return "";
}
static std::string get_quantity(std::string& str)
{
size_t i;
std::string quantity;
for (i = 0; i != str.size(); i++)
{
if (!std::isdigit(str[i]))
{
if (quantity.empty())
continue;
break;
}
quantity += str[i];
}
str.erase(i - quantity.size(), quantity.size());
return quantity;
}
int get_article_data(std::string& str, std::string& quantity, std::string& price)
{
price = get_price(str);
quantity = get_quantity(str);
return 0;
}
std::string get_token(char** av, char** env)
{
if (av[1] != NULL)
return av[1];
for (size_t i = 0; env[i] != NULL; ++i)
{
if (std::strncmp("BOT_TOKEN", env[i], 9) == 0)
return env[i] + 10;
}
return BOT_TOKEN;
}

6
src/utils.hpp Normal file
View File

@ -0,0 +1,6 @@
#pragma once
#include <string>
int get_article_data(std::string& str, std::string& quantity, std::string& price);
std::string get_token(char** av, char** env);