""" Code to send fms messages pillaged from hg infocalypse codebase.

    Copyright (C) 2011 Darrell Karbott

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public
    License as published by the Free Software Foundation; either
    version 2.0 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    General Public License for more details.

    You should have received a copy of the GNU General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

    Author: djk@isFiaD04zgAgnrEC5XJt1i4IE7AkNPqhBG5bONi6Yks
"""

import nntplib
import StringIO

def get_connection(fms_host, fms_port, user_name):
    """ Create an fms NNTP connection. """
    return nntplib.NNTP(fms_host, fms_port, user_name)

MSG_TEMPLATE = """From: %s
Newsgroups: %s
Subject: %s

%s"""

# Please use this function for good and not evil.
def send_msgs(server, msg_tuples, send_quit=False):
    """ Send messages via fms.
    msg_tuple format is: (sender, group, subject, text, send_callback)

    send_callback is optional.

    If it is present and not None send_callback(message_tuple)
    is invoked after each message is sent.

    It is legal to include additional client specific fields.
    """

    for msg_tuple in msg_tuples:
        raw_msg = MSG_TEMPLATE % (msg_tuple[0],
                                  msg_tuple[1],
                                  msg_tuple[2],
                                  msg_tuple[3])

        in_file = StringIO.StringIO(raw_msg)
        try:
            server.post(in_file)

            if len(msg_tuple) > 4 and not msg_tuple[4] is None:
                # Sent notifier
                msg_tuple[4](msg_tuple)

            if send_quit:
                server.quit()
        finally:
            in_file.close()