Skip to content
Snippets Groups Projects
notify_user.py 3.16 KiB
Newer Older
Bo-Chun Chen's avatar
Bo-Chun Chen committed
#!/usr/bin/env python
import json
Bo-Chun Chen's avatar
Bo-Chun Chen committed
import rc_util
Bo-Chun Chen's avatar
Bo-Chun Chen committed
import smtplib
Bo-Chun Chen's avatar
Bo-Chun Chen committed
import dataset
Bo-Chun Chen's avatar
Bo-Chun Chen committed
from rc_rmq import RCRMQ
from jinja2 import Template
Bo-Chun Chen's avatar
Bo-Chun Chen committed
from datetime import datetime
import rabbit_config as rcfg
import mail_config as mail_cfg

task = "notify_user"
Bo-Chun Chen's avatar
Bo-Chun Chen committed
args = rc_util.get_args()
logger = rc_util.get_logger(args)
Bo-Chun Chen's avatar
Bo-Chun Chen committed
db = dataset.connect(f"sqlite:///{rcfg.db_path}/user_reg.db")
table = db["users"]
Bo-Chun Chen's avatar
Bo-Chun Chen committed

Bo-Chun Chen's avatar
Bo-Chun Chen committed
# Instantiate rabbitmq object
rc_rmq = RCRMQ({"exchange": "RegUsr", "exchange_type": "topic"})
Bo-Chun Chen's avatar
Bo-Chun Chen committed
# Email instruction to user
def notify_user(ch, method, properties, body):
    msg = json.loads(body)
    username = msg["username"]
    user_email = msg["email"]
    msg["task"] = task
    msg["success"] = False
    errmsg = ""
Bo-Chun Chen's avatar
Bo-Chun Chen committed

    try:
Bo-Chun Chen's avatar
Bo-Chun Chen committed
        # Search username in database
        record = table.find_one(username=username)

        if record["sent"] is not None:
            errmsg = "Updating database counter"
Bo-Chun Chen's avatar
Bo-Chun Chen committed
            # Update counter
            count = record["count"]
Bo-Chun Chen's avatar
Bo-Chun Chen committed
            if args.dry_run:
                logger.info("Update counter in database")
Bo-Chun Chen's avatar
Bo-Chun Chen committed

            else:
                table.update(
                    {"username": username, "count": count + 1},
                    ["username"],
                )
Bo-Chun Chen's avatar
Bo-Chun Chen committed

            logger.debug(f"User {username} counter updated to {count + 1}")
Bo-Chun Chen's avatar
Bo-Chun Chen committed

        else:
Bo-Chun Chen's avatar
Bo-Chun Chen committed
            # Send email to user
            receivers = [user_email, rcfg.Admin_email]
            message = Template(mail_cfg.Whole_mail).render(
                username=username, to=user_email
            )
Bo-Chun Chen's avatar
Bo-Chun Chen committed

            if args.dry_run:
                logger.info(f"smtp = smtplib.SMTP({rcfg.Mail_server})")
                logger.info(
                    f"smtp.sendmail({rcfg.Sender}, {receivers}, message)"
                )
                logger.info(
Bo-Chun Chen's avatar
Bo-Chun Chen committed
                    f"table.update({{'username': {username}, 'count': 1,"
                    " 'sent_at': datetime.now()}}, ['username'])"
Bo-Chun Chen's avatar
Bo-Chun Chen committed

            else:
                errmsg = "Sending email to user"
                smtp = smtplib.SMTP(rcfg.Mail_server)
                smtp.sendmail(rcfg.Sender, receivers, message)
Bo-Chun Chen's avatar
Bo-Chun Chen committed

                logger.debug(f"Email sent to: {user_email}")
Bo-Chun Chen's avatar
Bo-Chun Chen committed

                errmsg = "Updating database email sent time"
                table.update(
                    {
                        "username": username,
                        "count": 1,
                        "sent": datetime.now(),
                    },
                    ["username"],
                )
Bo-Chun Chen's avatar
Bo-Chun Chen committed

                logger.debug(f"User {username} inserted into database")
        msg["success"] = True
    except Exception:
        logger.error("", exc_info=True)
        msg["errmsg"] = errmsg if errmsg else "Unexpected error"
Bo-Chun Chen's avatar
Bo-Chun Chen committed
    # Send confirm message
Ravi Tripathi's avatar
Ravi Tripathi committed
    rc_rmq.publish_msg(
        {"routing_key": "confirm." + msg["queuename"], "msg": msg}
    )
    logger.debug(f"User {username} confirmation sent")
Bo-Chun Chen's avatar
Bo-Chun Chen committed
    # Acknowledge the message
    ch.basic_ack(delivery_tag=method.delivery_tag)
Bo-Chun Chen's avatar
Bo-Chun Chen committed

Bo-Chun Chen's avatar
Bo-Chun Chen committed
if __name__ == "__main__":
    logger.info(f"Start listening to queue: {task}")
    rc_rmq.start_consume(
        {"queue": task, "routing_key": "notify.*", "cb": notify_user}
    )

    logger.info("Disconnected")
Bo-Chun Chen's avatar
Bo-Chun Chen committed
    rc_rmq.disconnect()