// Path: vilebot/src/main/java/com/oldterns/vilebot/util/ASCII.java
// public final class ASCII
// {
//     private boolean negative;
// 
//     public ASCII()
//     {
//         this( false );
//     }
// 
//     public ASCII( final boolean negative )
//     {
//         this.negative = negative;
//     }
// 
//     public String convert( final BufferedImage image )
//     {
//         StringBuilder sb = new StringBuilder( ( image.getWidth() + 1 ) * image.getHeight() );
//         for ( int y = 0; y < image.getHeight(); y++ )
//         {
//             if ( sb.length() != 0 )
//                 sb.append( "\n" );
//             for ( int x = 0; x < image.getWidth(); x++ )
//             {
//                 Color pixelColor = new Color( image.getRGB( x, y ) );
//                 double gValue = (double) pixelColor.getRed() * 0.2989 + (double) pixelColor.getBlue() * 0.5870
//                     + (double) pixelColor.getGreen() * 0.1140;
//                 final char s = negative ? returnStrNeg( gValue ) : returnStrPos( gValue );
//                 sb.append( s );
//             }
//         }
//         return sb.toString();
//     }
// 
//     /**
//      * Create a new string and assign to it a string based on the grayscale value. If the grayscale value is very high,
//      * the pixel is very bright and assign characters such as . and , that do not appear very dark. If the grayscale
//      * value is very lowm the pixel is very dark, assign characters such as # and @ which appear very dark.
//      *
//      * @param g grayscale
//      * @return char
//      */
//     private char returnStrPos( double g )// takes the grayscale value as parameter
//     {
//         final char str;
// 
//         if ( g >= 230.0 )
//         {
//             str = ' ';
//         }
//         else if ( g >= 200.0 )
//         {
//             str = '.';
//         }
//         else if ( g >= 180.0 )
//         {
//             str = '*';
//         }
//         else if ( g >= 160.0 )
//         {
//             str = ':';
//         }
//         else if ( g >= 130.0 )
//         {
//             str = 'o';
//         }
//         else if ( g >= 100.0 )
//         {
//             str = '&';
//         }
//         else if ( g >= 70.0 )
//         {
//             str = '8';
//         }
//         else if ( g >= 50.0 )
//         {
//             str = '#';
//         }
//         else
//         {
//             str = '@';
//         }
//         return str; // return the character
//     }
// 
//     /**
//      * Same method as above, except it reverses the darkness of the pixel. A dark pixel is given a light character and
//      * vice versa.
//      *
//      * @param g grayscale
//      * @return char
//      */
//     private char returnStrNeg( double g )
//     {
//         final char str;
// 
//         if ( g >= 230.0 )
//         {
//             str = '@';
//         }
//         else if ( g >= 200.0 )
//         {
//             str = '#';
//         }
//         else if ( g >= 180.0 )
//         {
//             str = '8';
//         }
//         else if ( g >= 160.0 )
//         {
//             str = '&';
//         }
//         else if ( g >= 130.0 )
//         {
//             str = 'o';
//         }
//         else if ( g >= 100.0 )
//         {
//             str = ':';
//         }
//         else if ( g >= 70.0 )
//         {
//             str = '*';
//         }
//         else if ( g >= 50.0 )
//         {
//             str = '.';
//         }
//         else
//         {
//             str = ' ';
//         }
//         return str;
//     }
// }


import com.oldterns.vilebot.util.ASCII;
import org.pircbotx.hooks.ListenerAdapter;
import org.pircbotx.hooks.types.GenericMessageEvent;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
package com.oldterns.vilebot.handlers.user;



/**
 * Created by eunderhi on 17/08/15.
 */

public class ImageToAscii
    extends ListenerAdapter
{
    private static final Pattern questionPattern = Pattern.compile( "^!(convert)\\s(.+)$" );

    @Override
    public void onGenericMessage( final GenericMessageEvent event )
    {
        String text = event.getMessage();
        Matcher matcher = questionPattern.matcher( text );

        if ( matcher.matches() )
        {
            String URL = matcher.group( 2 );
            try
            {
                String image = convertImage( URL );
                event.respondWith( image );
            }
            catch ( Exception e )
            {
                event.respondWith( "Could not convert image." );
            }
        }
    }

    private String convertImage( String strURL )
        throws Exception
    {
        URL url = new URL( strURL );
        BufferedImage image = ImageIO.read( url );
        image = shrink( image );
// Path: vilebot/src/main/java/com/oldterns/vilebot/util/ASCII.java
// public final class ASCII
// {
//     private boolean negative;
// 
//     public ASCII()
//     {
//         this( false );
//     }
// 
//     public ASCII( final boolean negative )
//     {
//         this.negative = negative;
//     }
// 
//     public String convert( final BufferedImage image )
//     {
//         StringBuilder sb = new StringBuilder( ( image.getWidth() + 1 ) * image.getHeight() );
//         for ( int y = 0; y < image.getHeight(); y++ )
//         {
//             if ( sb.length() != 0 )
//                 sb.append( "\n" );
//             for ( int x = 0; x < image.getWidth(); x++ )
//             {
//                 Color pixelColor = new Color( image.getRGB( x, y ) );
//                 double gValue = (double) pixelColor.getRed() * 0.2989 + (double) pixelColor.getBlue() * 0.5870
//                     + (double) pixelColor.getGreen() * 0.1140;
//                 final char s = negative ? returnStrNeg( gValue ) : returnStrPos( gValue );
//                 sb.append( s );
//             }
//         }
//         return sb.toString();
//     }
// 
//     /**
//      * Create a new string and assign to it a string based on the grayscale value. If the grayscale value is very high,
//      * the pixel is very bright and assign characters such as . and , that do not appear very dark. If the grayscale
//      * value is very lowm the pixel is very dark, assign characters such as # and @ which appear very dark.
//      *
//      * @param g grayscale
//      * @return char
//      */
//     private char returnStrPos( double g )// takes the grayscale value as parameter
//     {
//         final char str;
// 
//         if ( g >= 230.0 )
//         {
//             str = ' ';
//         }
//         else if ( g >= 200.0 )
//         {
//             str = '.';
//         }
//         else if ( g >= 180.0 )
//         {
//             str = '*';
//         }
//         else if ( g >= 160.0 )
//         {
//             str = ':';
//         }
//         else if ( g >= 130.0 )
//         {
//             str = 'o';
//         }
//         else if ( g >= 100.0 )
//         {
//             str = '&';
//         }
//         else if ( g >= 70.0 )
//         {
//             str = '8';
//         }
//         else if ( g >= 50.0 )
//         {
//             str = '#';
//         }
//         else
//         {
//             str = '@';
//         }
//         return str; // return the character
//     }
// 
//     /**
//      * Same method as above, except it reverses the darkness of the pixel. A dark pixel is given a light character and
//      * vice versa.
//      *
//      * @param g grayscale
//      * @return char
//      */
//     private char returnStrNeg( double g )
//     {
//         final char str;
// 
//         if ( g >= 230.0 )
//         {
//             str = '@';
//         }
//         else if ( g >= 200.0 )
//         {
//             str = '#';
//         }
//         else if ( g >= 180.0 )
//         {
//             str = '8';
//         }
//         else if ( g >= 160.0 )
//         {
//             str = '&';
//         }
//         else if ( g >= 130.0 )
//         {
//             str = 'o';
//         }
//         else if ( g >= 100.0 )
//         {
//             str = ':';
//         }
//         else if ( g >= 70.0 )
//         {
//             str = '*';
//         }
//         else if ( g >= 50.0 )
//         {
//             str = '.';
//         }
//         else
//         {
//             str = ' ';
//         }
//         return str;
//     }
// }


// Path: vilebot/src/main/java/com/oldterns/vilebot/handlers/user/ImageToAscii.java
import com.oldterns.vilebot.util.ASCII;
import org.pircbotx.hooks.ListenerAdapter;
import org.pircbotx.hooks.types.GenericMessageEvent;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

package com.oldterns.vilebot.handlers.user;



/**
 * Created by eunderhi on 17/08/15.
 */

public class ImageToAscii
    extends ListenerAdapter
{
    private static final Pattern questionPattern = Pattern.compile( "^!(convert)\\s(.+)$" );

    @Override
    public void onGenericMessage( final GenericMessageEvent event )
    {
        String text = event.getMessage();
        Matcher matcher = questionPattern.matcher( text );

        if ( matcher.matches() )
        {
            String URL = matcher.group( 2 );
            try
            {
                String image = convertImage( URL );
                event.respondWith( image );
            }
            catch ( Exception e )
            {
                event.respondWith( "Could not convert image." );
            }
        }
    }

    private String convertImage( String strURL )
        throws Exception
    {
        URL url = new URL( strURL );
        BufferedImage image = ImageIO.read( url );
        image = shrink( image );
        return new ASCII().convert( image );