plugable-matrix-bot/plugins/woocommerce_coupons/woocommerce_coupons.py
Dennis eb2b887c0a Transitioned from JSON to Hjson. Closes #3
All configuration files and all messages files should now preferrable be
done in Hjson. This format supports, i.a. features, multi line strings
and commenting. This greatly improves readability.

All installation and documentation files are also updated in this
commit.
2019-01-14 23:47:38 +01:00

140 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))
# 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)