plugable-matrix-bot/plugins/woocommerce_coupons/woocommerce_coupons.py

143 lines
4.4 KiB
Python

__author__ = "Dennis Potter"
__copyright__ = "Copyright 2019, Dennis Potter"
__credits__ = ["Dennis Potter"]
__license__ = "GPL-3.0"
__version__ = "0.5.0"
__maintainer__ = "Dennis Potter"
__email__ = "dennis@dennispotter.eu"
from matrix_bot_api.mregex_handler import MRegexHandler
from woocommerce import API
from base64 import b64encode
import os
import hjson
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.hjson')
DATA_LOCATION = DATA_DIR + '/id.hjson'
HELP_LOCATION = MESSAGE_DIR + '/help'
MESSAGES_LOCATION = MESSAGE_DIR + '/messages.dutch.hjson'
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 hjson_data:
self.config = hjson.load(hjson_data)
# Load ID of coupon
with open(DATA_LOCATION) as hjson_data:
self.coupon_id = hjson.load(hjson_data)
# Load all messages for this plugin
with open(MESSAGES_LOCATION) as hjson_data:
self.messages = hjson.load(hjson_data)
# Define sensitivity
self.handler = []
self.handler.append(MRegexHandler(
"Peter coupon",
self.grab_coupon_callback,
bot))
# 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 hjson_data:
config = hjson.load(hjson_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).json()
# Create data directory
os.mkdir(DATA_DIR)
# Write to JSON file to save ID
with open(DATA_LOCATION, 'w') as hjson_data:
hjson.dump(ret['id'], hjson_data)