calculator listener reworked with FSM, project packaging change from gradle to maven

pull/2/head
Vyacheslav N. Boyko 2018-01-09 12:01:55 +03:00
parent ec2b27a490
commit bb0331ed57
25 changed files with 616 additions and 465 deletions

1
.gitignore vendored
View File

@ -46,3 +46,4 @@ build/*
google-search.txt
yandex-search.txt
target

View File

@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="Gradle: com.fasterxml.jackson.core:jackson-core:2.8.10">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.8.10/jackson-core-2.8.10.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: com.google.api-client:google-api-client:1.23.0">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.api-client/google-api-client/1.23.0/522ea860eb48dee71dfe2c61a1fd09663539f556/google-api-client-1.23.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.api-client/google-api-client/1.23.0/1da1acc283f4ff3ae0b67bc5ca25b6e387f3afa9/google-api-client-1.23.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: com.google.apis:google-api-services-customsearch:v1-rev57-1.23.0">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.apis/google-api-services-customsearch/v1-rev57-1.23.0/48a3bde3ea385a1329123e2392d37cd999deff93/google-api-services-customsearch-v1-rev57-1.23.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.apis/google-api-services-customsearch/v1-rev57-1.23.0/8676c78998bda0c2978c35c0dbf316d60413368/google-api-services-customsearch-v1-rev57-1.23.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="Gradle: com.google.code.findbugs:jsr305:1.3.9">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: com.google.guava:guava-jdk5:17.0">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava-jdk5/17.0/463f8378feba44df7ba7cd9272d01837dad62b36/guava-jdk5-17.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava-jdk5/17.0/cc6729ce0bc6cc29441cb3a04acad02aeeebb26e/guava-jdk5-17.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: com.google.http-client:google-http-client:1.23.0">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.http-client/google-http-client/1.23.0/8e86c84ff3c98eca6423e97780325b299133d858/google-http-client-1.23.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.http-client/google-http-client/1.23.0/fb386c0b92d0adff70acc4a88e5b8b624f26f798/google-http-client-1.23.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: com.google.http-client:google-http-client-jackson2:1.23.0">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.http-client/google-http-client-jackson2/1.23.0/fd6761f4046a8cb0455e6fa5f58e12b061e9826e/google-http-client-jackson2-1.23.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.http-client/google-http-client-jackson2/1.23.0/7472d2eeee59d3fbc255acb45ba1a692f61bef61/google-http-client-jackson2-1.23.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: com.google.oauth-client:google-oauth-client:1.23.0">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.oauth-client/google-oauth-client/1.23.0/e57ea1e2220bda5a2bd24ff17860212861f3c5cf/google-oauth-client-1.23.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.oauth-client/google-oauth-client/1.23.0/9030ee2be9844eb8c87c851ecf4c05f79b02e023/google-oauth-client-1.23.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: org.apache.commons:commons-lang3:3.7">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.7/557edd918fd41f9260963583ebf5a61a43a6b423/commons-lang3-3.7.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.7/e7e36219edde1c66c93495a75490d8f526c377cb/commons-lang3-3.7-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: org.apache.httpcomponents:httpclient:4.5.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5.3/httpclient-4.5.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5.3/httpclient-4.5.3-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: org.apache.httpcomponents:httpcore:4.4.8">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.8/70539e2a07865bab38b4153da1ce599cf081790a/httpcore-4.4.8.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.8/4b69507bc39c2e0c14798dd91ff4da82ac356f81/httpcore-4.4.8-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,9 @@
<component name="libraryTable">
<library name="Gradle: org.jsoup:jsoup:1.10.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/jsoup/jsoup/1.10.3/jsoup-1.10.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@ -1,78 +0,0 @@
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: "org.springframework.boot"
group 'ru.bvn13.jircbot'
version '1.0-SNAPSHOT'
apply plugin: 'java'
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
mavenLocal()
jcenter()
mavenCentral()
maven { url 'http://repo.spring.io/libs-release' }
maven { url "http://repo.springsource.org/repo" }
}
bootRun {
systemProperties = System.properties
}
configurations {
all*.exclude module: 'spring-boot-starter-logging'
}
dependencies {
// PircBot: https://github.com/TheLQ/pircbotx/wiki/Documentation
compile("org.pircbotx:pircbotx:2.1")
// Spring
compile(group: 'org.springframework.boot', name: 'spring-boot-starter', version:'1.5.8.RELEASE') {
exclude(module: 'spring-boot-starter-logging')
}
compile 'org.springframework.boot:spring-boot-starter-log4j2:1.5.8.RELEASE'
// lombok
compileOnly 'org.projectlombok:lombok:1.16.18'
// JSON
compile 'com.googlecode.json-simple:json-simple:1.1.1'
// Calculator
compile 'net.objecthunter:exp4j:0.4.8'
// HTML parser
compile 'org.jsoup:jsoup:1.10.3'
// Google API
compile 'com.google.apis:google-api-services-customsearch:v1-rev57-1.23.0'
// Logging
compile 'ch.qos.logback:logback-classic:1.2.3'
compile 'org.slf4j:slf4j-api:1.7.25'
compile 'org.apache.commons:commons-lang3:+'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:1.5.8.RELEASE"
}
}

172
gradlew vendored
View File

@ -1,172 +0,0 @@
#!/usr/bin/env sh
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save ( ) {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"

84
gradlew.bat vendored
View File

@ -1,84 +0,0 @@
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

59
jircbot.iml 100644
View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="Spring" name="Spring">
<configuration />
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.pircbotx:pircbotx:2.1" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.10" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava:19.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:1.5.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:1.5.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:4.3.13.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:4.3.13.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:4.3.13.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:4.3.13.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:1.5.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:1.5.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jcl-over-slf4j:1.7.25" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:log4j-over-slf4j:1.7.25" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:4.3.13.RELEASE" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.yaml:snakeyaml:1.17" level="project" />
<orderEntry type="library" name="Maven: com.googlecode.json-simple:json-simple:1.1.1" level="project" />
<orderEntry type="library" name="Maven: net.objecthunter:exp4j:0.4.8" level="project" />
<orderEntry type="library" name="Maven: org.jsoup:jsoup:1.11.2" level="project" />
<orderEntry type="library" name="Maven: com.google.apis:google-api-services-customsearch:v1-rev57-1.23.0" level="project" />
<orderEntry type="library" name="Maven: com.google.api-client:google-api-client:1.23.0" level="project" />
<orderEntry type="library" name="Maven: com.google.oauth-client:google-oauth-client:1.23.0" level="project" />
<orderEntry type="library" name="Maven: com.google.http-client:google-http-client:1.23.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.0.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.0.1" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.1.1" level="project" />
<orderEntry type="library" name="Maven: com.google.code.findbugs:jsr305:1.3.9" level="project" />
<orderEntry type="library" name="Maven: com.google.http-client:google-http-client-jackson2:1.23.0" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.1.3" level="project" />
<orderEntry type="library" name="Maven: com.google.guava:guava-jdk5:17.0" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.7" level="project" />
<orderEntry type="library" name="Maven: ru.bvn13:fsm:1.0" level="project" />
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.16.16" level="project" />
<orderEntry type="library" name="Maven: junit:junit:4.12" level="project" />
<orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
</component>
</module>

138
pom.xml 100644
View File

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.bvn13</groupId>
<artifactId>jircbot</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<repositories>
<repository>
<id>FinalStateMachine-mvn-repo</id>
<url>https://raw.github.com/bvn13/FinalStateMachine/mvn-repo/</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<dependencies>
<!--pircbotx-->
<dependency>
<groupId>org.pircbotx</groupId>
<artifactId>pircbotx</artifactId>
<version>2.1</version>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>1.5.9.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>org.springframework.boot</artifactId>
<groupId>spring-boot-starter-logging</groupId>
</exclusion>
</exclusions>
</dependency>
<!--<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>1.5.9.RELEASE</version>
</dependency>-->
<!--json-->
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<!--Calculator-->
<dependency>
<groupId>net.objecthunter</groupId>
<artifactId>exp4j</artifactId>
<version>0.4.8</version>
</dependency>
<!--HTML parser-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.2</version>
</dependency>
<!--Google API-->
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-customsearch</artifactId>
<version>v1-rev57-1.23.0</version>
</dependency>
<!--logging-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<!--FSM-->
<dependency>
<groupId>ru.bvn13</groupId>
<artifactId>fsm</artifactId>
<version>1.0</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
</dependency>
<!--tests-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>

View File

@ -1,2 +0,0 @@
rootProject.name = 'jircbot'

View File

@ -13,6 +13,7 @@ import org.springframework.stereotype.Component;
import ru.bvn13.jircbot.Services.YandexSearchService;
import ru.bvn13.jircbot.config.JircBotConfiguration;
import ru.bvn13.jircbot.listeners.*;
import ru.bvn13.jircbot.listeners.calculator.CalculatorListener;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
@ -64,9 +65,9 @@ public class JircBot extends ListenerAdapter {
.addListener(new CalculatorListener()) //This class is a listener, so add it to the bots known listeners
.addListener(new GoogleDoodleListener(this.config))
//.addListener(new GoogleSearchListener(this.config))
.addListener(new UrlRetrieverListener())
//.addListener(new UrlRetrieverListener())
.addListener(new RegexCheckerListener())
.addListener(new YandexSearchListener(this.config, this.yandexSearchService))
//.addListener(new YandexSearchListener(this.config, this.yandexSearchService))
.setServers(servers)
.setAutoReconnect(true)
//.addAutoJoinChannel(c.getChannelName()) //Join the official #pircbotx channel

View File

@ -9,8 +9,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import ru.bvn13.jircbot.listeners.GoogleDoodleListener;
import ru.bvn13.jircbot.listeners.YandexSearchListener;
import ru.bvn13.jircbot.model.*;
import javax.annotation.PostConstruct;
@ -62,7 +60,7 @@ public class JircBotConfiguration {
}
JSONObject lstnrSettings = (JSONObject) jsonObject.get("settings");
this.listenersSettings.put(KEY_GOOGLE_DOODLE, this.readGoogleDoodleSettins(lstnrSettings));
this.listenersSettings.put(KEY_GOOGLE_DOODLE, this.readGoogleDoodleSettings(lstnrSettings));
this.listenersSettings.put(KEY_GOOGLE_SEARCH, this.readGoogleSearchSettings(lstnrSettings));
this.listenersSettings.put(KEY_YANDEX_SEARCH, this.readYandexSearchSettings(lstnrSettings));
@ -104,7 +102,7 @@ public class JircBotConfiguration {
return config;
}
private ListenerSettings readGoogleDoodleSettins(JSONObject data) {
private ListenerSettings readGoogleDoodleSettings(JSONObject data) {
GoogleDoodleSettings sets = new GoogleDoodleSettings();
JSONObject googleSets = (JSONObject) data.get("doodle");
sets.setMainUrl((String) googleSets.get("mainUrl"));

View File

@ -1,107 +0,0 @@
package ru.bvn13.jircbot.listeners;
import net.objecthunter.exp4j.Expression;
import net.objecthunter.exp4j.ExpressionBuilder;
import org.pircbotx.hooks.ListenerAdapter;
import org.pircbotx.hooks.WaitForQueue;
import org.pircbotx.hooks.events.MessageEvent;
import org.pircbotx.hooks.types.GenericMessageEvent;
public class CalculatorListener extends ListenerAdapter {
private static final String COMMAND = "?calc ";
@Override
public void onGenericMessage(final GenericMessageEvent event) throws Exception {
if (event.getUser().getUserId().equals(event.getBot().getUserBot().getUserId())) {
return;
}
if (!event.getMessage().startsWith(COMMAND.trim())) {
return;
}
String message = event.getMessage().replace(COMMAND, "").trim();
String[] commands = message.split(" ", 2);
if (commands.length == 0 || commands[0].isEmpty() || commands[0].trim().equalsIgnoreCase("help")) {
event.respond(this.helpMessage());
return;
}
if (this.checkComand(commands[0].trim())) {
return;
}
String expressionString = message;
event.respond("EXPRESSION: "+expressionString);
ExpressionBuilder expressionBuilder = new ExpressionBuilder(expressionString);
Expression exp = null;
WaitForQueue queue = new WaitForQueue(event.getBot());
while (true) {
MessageEvent currentEvent = queue.waitFor(MessageEvent.class);
if (currentEvent.getMessage().startsWith(COMMAND)) {
message = currentEvent.getMessage().replace(COMMAND, "").trim();
commands = message.split(" ", 2);
if (commands.length == 0 || commands[0].isEmpty()) {
currentEvent.respond("Command is expected.");
currentEvent.respond(this.helpMessage());
} else if (commands[0].trim().equalsIgnoreCase("vars")) {
exp = expressionBuilder.variables(commands[1].trim()).build();
currentEvent.respond("VARIABLES: "+commands[1].trim());
} else if (commands[0].trim().equalsIgnoreCase("set")) {
String[] variableData = commands[1].trim().split("=", 2);
if (variableData.length < 2 || variableData[0].isEmpty() || variableData[1].isEmpty()) {
currentEvent.respond("FORMAT: variable = value");
} else {
if (exp == null) {
//currentEvent.respond("Variables are not set!");
exp = expressionBuilder.build();
} else {
Double value = Double.parseDouble(variableData[1].trim());
exp = exp.setVariable(variableData[0].trim(), value);
currentEvent.respond(String.format("VARIABLE SET: %s = %f", variableData[0].trim(), value));
}
}
} else if (commands[0].trim().equalsIgnoreCase("done")) {
if (exp == null) {
exp = expressionBuilder.build();
}
Double result = exp.evaluate();
currentEvent.respond(String.format("%s = %f", expressionString, result));
expressionBuilder = null;
exp = null;
queue.close();
return;
} else {
currentEvent.respond(this.helpMessage());
}
}
}
}
private Boolean checkComand(String command) {
return command.equalsIgnoreCase("vars")
|| command.equalsIgnoreCase("set")
|| command.equalsIgnoreCase("done");
}
private String helpMessage() {
return "CALCULATOR (powered by Exp4J) | "+
"Commands: | "+
"vars - set variables names delimetered by comma, i.e.: a, b | "+
"set - set variable, i.e.: a = 2 | "+
"done - evaluate expression";
}
}

View File

@ -0,0 +1,224 @@
package ru.bvn13.jircbot.listeners.calculator;
import lombok.Data;
import net.objecthunter.exp4j.Expression;
import net.objecthunter.exp4j.ExpressionBuilder;
import org.pircbotx.hooks.types.GenericMessageEvent;
import ru.bvn13.fsm.Condition;
import ru.bvn13.fsm.Exceptions.FSMException;
import ru.bvn13.fsm.Exceptions.NotInitedException;
import ru.bvn13.fsm.FSM;
import ru.bvn13.fsm.State;
/**
* Created by bvn13 on 03.01.2018.
*/
@Data
public class CalculatorDialog extends FSM {
public static final String COMMAND = "?calc ";
private String command;
private String[] commands;
private GenericMessageEvent event;
private String expression;
private ExpressionBuilder expressionBuilder;
private Expression exp = null;
public static CalculatorDialog createDialog() throws FSMException {
CalculatorDialog dialog = new CalculatorDialog();
dialog.initState(new State("init") {
@Override
public void process() {
CalculatorDialog dialog = ((CalculatorDialog)this.getFSM());
dialog.expression = dialog.command;
dialog.expressionBuilder = new ExpressionBuilder(dialog.expression);
dialog.event.respond("inited, expression: "+dialog.expression);
}
});
dialog.addTransition("init", new State("entering-vars") {
@Override
public void beforeEvent() {
CalculatorDialog dialog = ((CalculatorDialog)this.getFSM());
dialog.event.respond("please enter variables (comma separated)");
}
@Override
public void process() {
CalculatorDialog dialog = ((CalculatorDialog)this.getFSM());
dialog.enteringVars();
}
});
dialog.addTransition("entering-vars", new State("settings-vars") {
@Override
public void beforeEvent() {
CalculatorDialog dialog = ((CalculatorDialog)this.getFSM());
dialog.event.respond("please set variable");
}
@Override
public void process() {
CalculatorDialog dialog = ((CalculatorDialog)this.getFSM());
dialog.settingVars();
}
}, new Condition() {
@Override
public boolean check() {
CalculatorDialog dialog = ((CalculatorDialog)this.getFSM());
return dialog.commands[0].equalsIgnoreCase("vars");
}
});
dialog.addTransition("settings-vars", "settings-vars", new Condition() {
@Override
public boolean check() {
CalculatorDialog dialog = ((CalculatorDialog)this.getFSM());
return !dialog.commands[0].equalsIgnoreCase("done");
}
});
dialog.addTransition("settings-vars", new State("calculating", true) {
@Override
public void process() {
CalculatorDialog dialog = ((CalculatorDialog)this.getFSM());
dialog.calculating();
}
}, new Condition() {
@Override
public boolean check() {
CalculatorDialog dialog = ((CalculatorDialog)this.getFSM());
return dialog.commands[0].equalsIgnoreCase("done");
}
});
dialog.addTransition("entering-vars", "calculating", new Condition() {
@Override
public boolean check() {
CalculatorDialog dialog = ((CalculatorDialog)this.getFSM());
return dialog.commands[0].equalsIgnoreCase("done");
}
});
dialog.addTransition("entering-vars", new State("helping-entering-vars") {
@Override
public void process() {
CalculatorDialog dialog = ((CalculatorDialog)this.getFSM());
dialog.event.respond(dialog.helpMessage());
//dialog.event.respond("Please set vars");
try {
dialog.next();
} catch (FSMException e) {
e.printStackTrace();
}
}
}, new Condition() {
@Override
public boolean check() {
CalculatorDialog dialog = ((CalculatorDialog)this.getFSM());
return !dialog.commands[0].equalsIgnoreCase("done")
&& !dialog.commands[0].equalsIgnoreCase("vars");
}
});
dialog.addTransition("helping-entering-vars", "entering-vars");
return dialog;
}
private void enteringVars() {
exp = expressionBuilder.variables(commands[1].trim()).build();
event.respond("VARIABLES: "+commands[1].trim());
}
private void settingVars() {
String[] variableData = commands[1].trim().split("=", 2);
if (variableData.length < 2 || variableData[0].isEmpty() || variableData[1].isEmpty()) {
event.respond("FORMAT: variable = value");
} else {
if (exp == null) {
//currentEvent.respond("Variables are not set!");
exp = expressionBuilder.build();
} else {
Double value = Double.parseDouble(variableData[1].trim());
exp = exp.setVariable(variableData[0].trim(), value);
event.respond(String.format("VARIABLE SET: %s = %f", variableData[0].trim(), value));
}
}
}
private void calculating() {
if (exp == null) {
exp = expressionBuilder.build();
}
Double result = exp.evaluate();
event.respond(String.format("%s = %f", expression, result));
expressionBuilder = null;
exp = null;
return;
}
public void setEvent(GenericMessageEvent event) {
this.event = event;
}
public void processCommand(String userMessage) {
if (prepareCommand(userMessage)) {
return;
}
if (this.getCurrentState()==null || this.getCurrentState().isFinish()) {
try {
this.init();
} catch (NotInitedException e) {
e.printStackTrace();
}
}
try {
this.next();
} catch (FSMException e) {
e.printStackTrace();
}
}
private boolean prepareCommand(String userMessage) {
String message = userMessage.replace(COMMAND, "").trim();
this.commands = message.split(" ", 2);
if (commands.length == 0 || commands[0].isEmpty() || commands[0].trim().equalsIgnoreCase("help")) {
event.respond(this.helpMessage());
return true;
}
if (this.checkComand(commands[0].trim())) {
return false;
}
this.command = message;
return false;
}
private String helpMessage() {
return "CALCULATOR (powered by Exp4J) | "+
"Commands: | "+
"vars - set variables names delimetered by comma, i.e.: a, b | "+
"set - set variable, i.e.: a = 2 | "+
"done - evaluate expression";
}
private Boolean checkComand(String command) {
return command.equalsIgnoreCase("vars")
|| command.equalsIgnoreCase("set")
|| command.equalsIgnoreCase("done");
}
}

View File

@ -0,0 +1,50 @@
package ru.bvn13.jircbot.listeners.calculator;
import net.objecthunter.exp4j.Expression;
import net.objecthunter.exp4j.ExpressionBuilder;
import org.pircbotx.hooks.ListenerAdapter;
import org.pircbotx.hooks.WaitForQueue;
import org.pircbotx.hooks.events.MessageEvent;
import org.pircbotx.hooks.types.GenericMessageEvent;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class CalculatorListener extends ListenerAdapter {
private Map<UUID, CalculatorDialog> dialogs = new HashMap<>();
@Override
public void onGenericMessage(final GenericMessageEvent event) throws Exception {
if (event.getUser().getUserId().equals(event.getBot().getUserBot().getUserId())) {
return;
}
if (!event.getMessage().startsWith(CalculatorDialog.COMMAND.trim())) {
return;
}
CalculatorDialog dialog = null;
if (this.dialogs.containsKey(event.getUser().getUserId())) {
dialog = this.dialogs.get(event.getUser().getUserId());
} else {
dialog = CalculatorDialog.createDialog();
this.dialogs.put(event.getUser().getUserId(), dialog);
}
dialog.setEvent(event);
dialog.processCommand(event.getMessage());
}
}

View File

@ -11,24 +11,21 @@
</appender>
<jmxConfigurator />
<logger name="ru.bvn13.jircbot" level="ALL"/>
<logger name="ru.bvn13.jircbot.listeners" level="ALL"/>
<logger name="ru.bvn13.jircbot.listeners.calculator" level="ALL"/>
<logger name="org.hibernate.SQL" level="WARN"/>
<!--<logger name="org.hibernate.type" level="TRACE">-->
<!--<appender-ref ref="STDOUT" />-->
<!--</logger>-->
<logger name="org.springframework" level="DEBUG"/>
<logger name="org.pircbotx.PircBotX" level="DEBUG"/>
<root level="WARN">
<appender-ref ref="STDOUT" />
</root>
<logger name="ru.bvn13.jircbot" level="ALL">
<appender-ref ref="STDOUT" />
</logger>
<logger name="org.hibernate.SQL" level="WARN">
<appender-ref ref="STDOUT" />
</logger>
<!--<logger name="org.hibernate.type" level="TRACE">-->
<!--<appender-ref ref="STDOUT" />-->
<!--</logger>-->
<logger name="org.springframework" level="DEBUG">
<appender-ref ref="STDOUT" />
</logger>
<logger name="org.pircbotx.PircBotX" level="DEBUG">
<appender-ref ref="STDOUT" />
</logger>
</configuration>