Have the Feedback Bot provide the sender's full name. Put the email in the message to help searching. Generate a ticket number to make it easier to refer to the message from elsewhere. (imported from commit 4d789135a0097bade50b4d980f49ca596d85b73b)
		
			
				
	
	
		
			90 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
#!/usr/bin/env python
 | 
						|
import sys
 | 
						|
from os import path
 | 
						|
import logging
 | 
						|
 | 
						|
sys.path.append(path.join(path.dirname(__file__), '../api'))
 | 
						|
import zulip
 | 
						|
sys.path.append(path.join(path.dirname(__file__), '../zproject'))
 | 
						|
import local_settings
 | 
						|
 | 
						|
class StreamLogger(object):
 | 
						|
    """
 | 
						|
    Give a file-like interface to a logger instance.
 | 
						|
    """
 | 
						|
    def __init__(self, logger, log_level=logging.INFO):
 | 
						|
        self.logger = logger
 | 
						|
        self.log_level = log_level
 | 
						|
        self.buffer = ""
 | 
						|
 | 
						|
    def write(self, message):
 | 
						|
        self.buffer += message
 | 
						|
 | 
						|
        if message[-1] == "\n":
 | 
						|
            self.logger.log(self.log_level, self.buffer.rstrip())
 | 
						|
            self.buffer = ""
 | 
						|
 | 
						|
logging.basicConfig(filename="/var/log/zulip/feedback-bot.log",
 | 
						|
                    level=logging.DEBUG, format="%(asctime)s %(levelname)s\t%(message)s")
 | 
						|
 | 
						|
# The API prints to stdout, so capture and format those messages as well.
 | 
						|
stdout_logger = StreamLogger(logging.getLogger("stdout"), logging.INFO)
 | 
						|
sys.stdout = stdout_logger
 | 
						|
 | 
						|
stderr_logger = StreamLogger(logging.getLogger("stderr"), logging.ERROR)
 | 
						|
sys.stderr = stderr_logger
 | 
						|
 | 
						|
prod_client = zulip.Client(
 | 
						|
    email="feedback@zulip.com",
 | 
						|
    api_key=local_settings.FEEDBACK_BOT_KEY,
 | 
						|
    verbose=True,
 | 
						|
    site="https://api.zulip.com")
 | 
						|
staging_client = zulip.Client(
 | 
						|
    email="feedback@zulip.com",
 | 
						|
    api_key=local_settings.FEEDBACK_BOT_KEY,
 | 
						|
    verbose=True,
 | 
						|
    site="https://staging.zulip.com/api")
 | 
						|
 | 
						|
def get_ticket_number():
 | 
						|
    fn = '/var/tmp/.feedback-bot-ticket-number'
 | 
						|
    try:
 | 
						|
        ticket_number = int(open(fn).read()) + 1
 | 
						|
    except:
 | 
						|
        ticket_number = 1
 | 
						|
    open(fn, 'w').write('%d' % ticket_number)
 | 
						|
    return ticket_number
 | 
						|
 | 
						|
def forward_message(message):
 | 
						|
    if message["type"] != "private" or len(message["display_recipient"]) != 2:
 | 
						|
        return
 | 
						|
 | 
						|
    if "sender_domain" in message:
 | 
						|
        subject = "feedback: %s (%s)" % (message["sender_email"], message["sender_domain"])
 | 
						|
    else:
 | 
						|
        subject = "feedback from %s" % message["sender_email"],
 | 
						|
    if len(subject) > 60:
 | 
						|
        subject = subject[:57].rstrip() + "..."
 | 
						|
 | 
						|
    ticket_number = get_ticket_number()
 | 
						|
    content = '@support, Please ack this new request.'
 | 
						|
    content += '\n~~~'
 | 
						|
    content += '\nticket Z%03d' % (ticket_number,)
 | 
						|
    content += '\nsender: %s' % (message['sender_full_name'],)
 | 
						|
    content += '\nemail: %s' % (message['sender_email'],)
 | 
						|
    if 'sender_domain' in message:
 | 
						|
        content += '\nrealm: %s' % (message['sender_domain'],)
 | 
						|
    content += '\n~~~'
 | 
						|
 | 
						|
    content += '\n\n'
 | 
						|
    content += message['content']
 | 
						|
 | 
						|
    forwarded_message = {
 | 
						|
        "type": "stream",
 | 
						|
        "to": "support",
 | 
						|
        "subject": subject,
 | 
						|
        "content": content,
 | 
						|
        }
 | 
						|
    staging_client.send_message(forwarded_message)
 | 
						|
    logging.info("Forwarded feedback from %s" % (message["sender_email"],))
 | 
						|
 | 
						|
prod_client.call_on_each_message(forward_message)
 |