de.snertlab.xdccBee.irc.DccMessageParser.java Source code

Java tutorial

Introduction

Here is the source code for de.snertlab.xdccBee.irc.DccMessageParser.java

Source

/*
 * Project: xdccBee
 * Copyright (C) 2009 snert@snert-lab.de,
 *
 *  This program 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 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program 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 program.  If not, see <http://www.gnu.org/licenses/>.
 */
package de.snertlab.xdccBee.irc;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

/**
 * @author snert
 * 
 */
public class DccMessageParser {
    // [^\w]?#\u0002?([0-9]*).*?[0-9]+[xX]{1}.*?[:space:]?\[?([:space:]?[0-9]+[\.,]?[0-9]*[
    // ]*[a-zA-ZA-Za-z]*?)\]?[^\w]{1}(.*)
    private static final Pattern DCC_MESSAGE_PATTER = Pattern.compile("[^\\w]?#\u0002?" + //$NON-NLS-1$
            "([0-9]*)" + //Packet Nummer group(1) //$NON-NLS-1$
            ".*?[0-9]+[xX]{1}.*?[:space:]?\\[?" + //$NON-NLS-1$
            "([:space:]?[0-9]+[\\.,]?[0-9]*[ ]*[a-zA-ZA-Za-z]*?)" + //Packet Groee group(2) //$NON-NLS-1$
            "\\]?[^\\w]{1}" + //$NON-NLS-1$
            "(.*)" //Packet Name group(3) //$NON-NLS-1$
    );

    /*
     * Dcc Message Examples: #1 97x [ 42K] [CAT]_Releases.txt #2 22x [123M]
     * [CAT]_Cooking_fish_howto_video.avi #3 14x [123M]
     * [CAT]_Meow_Mix_advertisement.avi
     */

    public static boolean isDccMessage(String message) {
        String s = cleanMessage(message);
        Matcher m = DCC_MESSAGE_PATTER.matcher(s);
        if (m.find()) {
            return true;
        }
        return false;
    }

    public static DccPacket buildDccPacket(String sender, String dccMessage) {
        DccPacket dccPacket = new DccPacket();
        dccPacket.setSender(sender);

        String s = cleanMessage(dccMessage);
        Matcher m = DCC_MESSAGE_PATTER.matcher(s);
        if (m.find()) {
            dccPacket.setPacketNr(Integer.parseInt(StringUtils.trim(m.group(1))));
            dccPacket.setSize(StringUtils.trim(m.group(2)));
            String packetName = m.group(3);
            packetName = StringUtils.trim(packetName);
            dccPacket.setName(packetName);
        }
        return dccPacket;
    }

    /*
     * Delete any color codes, font modes from the given str These control
     * characters are based on the unofficial mirc implementation Returns clean
     * version of message \002 => Bold \003[??][,??] => Forground color,
     * background color \x0F => Switch back to plain mode \x16 => Reverse mode
     * 0x1F => Underline thanks to Ruby xdccfetch
     */
    private static String delete_control_codes(String packetName) {
        String s = packetName;
        s = s.replaceAll("\\002|\\003(\\d{1,2})?(,\\d{1,2})?|\\x0F|\\x16|\\x1F", "");
        s = StringUtils.trim(s);
        return s;
    }

    private static String cleanMessage(String message) {
        String s = message;
        s = delete_control_codes(message);
        s = s.replace("^\\s+|\\s+$", "");
        return s;
    }
}