Added a WooCommerce Coupon plugin
This plugin sets up a coupon on installation and sends this coupon to a user that asks for it. The plugin supports an expiration period. After this period, it will renew the coupon.
This commit is contained in:
parent
6388f5e104
commit
6cb3ecc373
1
plugins/woocommerce_coupons/README.md
Normal file
1
plugins/woocommerce_coupons/README.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
|
14
plugins/woocommerce_coupons/config.json.template
Normal file
14
plugins/woocommerce_coupons/config.json.template
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"rest_api": {
|
||||||
|
"shop_url": "https://alcuinus.nl",
|
||||||
|
"consumer_key": "",
|
||||||
|
"consumer_secret": "",
|
||||||
|
"wp_api": true,
|
||||||
|
"version": "wc/v1"
|
||||||
|
},
|
||||||
|
|
||||||
|
"coupon": {
|
||||||
|
"max_days": 31,
|
||||||
|
"percentage":20
|
||||||
|
}
|
||||||
|
}
|
2
plugins/woocommerce_coupons/messages/help
Normal file
2
plugins/woocommerce_coupons/messages/help
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<h5><i>coupon</i></h5>
|
||||||
|
Als je me een bericht stuurt met het keyword <i>coupon</i> zal ik je de coupon sturen die voor 20% korting op de <a href="https://alcuinus.nl/shop">Alcuinus webshop</a> zorgt.
|
5
plugins/woocommerce_coupons/messages/messages.dutch.json
Normal file
5
plugins/woocommerce_coupons/messages/messages.dutch.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
|
||||||
|
"coupon_message" : "De huidige code om {}% korting te krijgen is: <i><strong>{}</strong></i>. Ga meteen naar <a href=\"https://alcuinus.nl/shop\">de webshop</a> om hem te gebruiken!"
|
||||||
|
|
||||||
|
}
|
1
plugins/woocommerce_coupons/requirements.txt
Normal file
1
plugins/woocommerce_coupons/requirements.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
WooCommerce
|
131
plugins/woocommerce_coupons/woocommerce_coupons.py
Normal file
131
plugins/woocommerce_coupons/woocommerce_coupons.py
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
from matrix_bot_api.mregex_handler import MRegexHandler
|
||||||
|
from woocommerce import API
|
||||||
|
from base64 import b64encode
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import datetime as dt
|
||||||
|
|
||||||
|
MESSAGE_DIR = os.path.join(os.path.dirname(__file__), 'messages')
|
||||||
|
DATA_DIR = os.path.join(os.path.dirname(__file__),'../../data/woocommerce')
|
||||||
|
CONFIG_LOCATION = os.path.join(os.path.dirname(__file__), 'config.json')
|
||||||
|
|
||||||
|
DATA_LOCATION = DATA_DIR + '/id.json'
|
||||||
|
HELP_LOCATION = MESSAGE_DIR + '/help'
|
||||||
|
MESSAGES_LOCATION = MESSAGE_DIR + '/messages.dutch.json'
|
||||||
|
|
||||||
|
class Plugin:
|
||||||
|
""" This is an example plugin with only a single callback. When
|
||||||
|
a user says "Hello bot" in a room in which te bot is present,
|
||||||
|
the user replies with "Hello <username>!".
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, bot):
|
||||||
|
# Load the configuration
|
||||||
|
with open(CONFIG_LOCATION) as json_data:
|
||||||
|
self.config = json.load(json_data)
|
||||||
|
|
||||||
|
# Load ID of coupon
|
||||||
|
with open(DATA_LOCATION) as json_data:
|
||||||
|
self.coupon_id = json.load(json_data)
|
||||||
|
|
||||||
|
# Load all messages for this plugin
|
||||||
|
with open(MESSAGES_LOCATION) as json_data:
|
||||||
|
self.messages = json.load(json_data)
|
||||||
|
|
||||||
|
# Define sensitivity
|
||||||
|
self.handler = []
|
||||||
|
|
||||||
|
self.handler.append(MRegexHandler("Peter coupon", self.grab_coupon_callback))
|
||||||
|
|
||||||
|
# initialize WooCommerce connection
|
||||||
|
self.wcapi = API(
|
||||||
|
url=self.config['rest_api']['shop_url'],
|
||||||
|
consumer_key=self.config['rest_api']['consumer_key'],
|
||||||
|
consumer_secret=self.config['rest_api']['consumer_secret'],
|
||||||
|
wp_api=self.config['rest_api']['wp_api'],
|
||||||
|
version=self.config['rest_api']['version'],
|
||||||
|
query_string_auth=True
|
||||||
|
)
|
||||||
|
|
||||||
|
# Save parent bot
|
||||||
|
self.bot = bot
|
||||||
|
|
||||||
|
def grab_coupon_callback(self, room, event):
|
||||||
|
coupon_json = self.wcapi.get(f"coupons/{self.coupon_id}").json()
|
||||||
|
|
||||||
|
datetime_now = dt.datetime.now().strftime("%Y-%m-%dT%H:%M:%S")
|
||||||
|
|
||||||
|
|
||||||
|
if coupon_json['expiry_date'] < datetime_now:
|
||||||
|
# Refresh coupon
|
||||||
|
|
||||||
|
# Create random token and determine max validity
|
||||||
|
vld_days = self.config['coupon']['max_days']
|
||||||
|
|
||||||
|
token = b64encode(os.urandom(8)).decode('utf-8').lower()[0:-1]
|
||||||
|
expires_dat = (dt.datetime.now()
|
||||||
|
+ dt.timedelta(days = vld_days)).strftime(
|
||||||
|
"%Y-%m-%dT%H:%M:%S")
|
||||||
|
|
||||||
|
data = {
|
||||||
|
"code": token,
|
||||||
|
"amount": self.config['coupon']['percentage'],
|
||||||
|
"expiry_date": expires_dat,
|
||||||
|
}
|
||||||
|
|
||||||
|
self.wcapi.put(f"coupons/{self.coupon_id}", data)
|
||||||
|
|
||||||
|
room.send_html(self.messages['coupon_message'].format(
|
||||||
|
coupon_json["amount"].split('.')[0],
|
||||||
|
token))
|
||||||
|
|
||||||
|
else:
|
||||||
|
room.send_html(self.messages['coupon_message'].format(
|
||||||
|
coupon_json["amount"].split('.')[0],
|
||||||
|
coupon_json["code"]))
|
||||||
|
|
||||||
|
def help(self):
|
||||||
|
return open(HELP_LOCATION, mode="r").read()
|
||||||
|
|
||||||
|
def setup():
|
||||||
|
"""This function initializes a coupon with a given percentage"""
|
||||||
|
|
||||||
|
# Load the configuration
|
||||||
|
with open(CONFIG_LOCATION) as json_data:
|
||||||
|
config = json.load(json_data)
|
||||||
|
|
||||||
|
# Create random token and determine max validity
|
||||||
|
vld_days = config['coupon']['max_days']
|
||||||
|
|
||||||
|
token = b64encode(os.urandom(8)).decode('utf-8').lower()[0:-1]
|
||||||
|
expires_dat = (dt.datetime.now() + dt.timedelta(days = vld_days)).strftime(
|
||||||
|
"%Y-%m-%dT%H:%M:%S")
|
||||||
|
|
||||||
|
data = {
|
||||||
|
"code": token,
|
||||||
|
"discount_type": "percent",
|
||||||
|
"amount": config['coupon']['percentage'],
|
||||||
|
"individual_use": True,
|
||||||
|
"exclude_sale_items": True,
|
||||||
|
"expiry_date": expires_dat,
|
||||||
|
}
|
||||||
|
|
||||||
|
wcapi = API(
|
||||||
|
url=config['rest_api']['shop_url'],
|
||||||
|
consumer_key=config['rest_api']['consumer_key'],
|
||||||
|
consumer_secret=config['rest_api']['consumer_secret'],
|
||||||
|
wp_api=config['rest_api']['wp_api'],
|
||||||
|
version=config['rest_api']['version'],
|
||||||
|
query_string_auth=True
|
||||||
|
)
|
||||||
|
|
||||||
|
# Send to shop
|
||||||
|
ret = wcapi.post("coupons", data)
|
||||||
|
|
||||||
|
# Create data directory
|
||||||
|
os.mkdir(DATA_DIR)
|
||||||
|
|
||||||
|
# Write to JSON file to save ID
|
||||||
|
with open(DATA_LOCATION, 'w') as json_data:
|
||||||
|
json.dump(ret['id'], json_data)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user