diff --git a/.classpath b/.classpath
index f5a2fae..d63fc6c 100644
--- a/.classpath
+++ b/.classpath
@@ -4,12 +4,16 @@
-
+
+
+
+
+
diff --git a/.hgignore b/.hgignore
index 28191b1..6bf8929 100644
--- a/.hgignore
+++ b/.hgignore
@@ -1,5 +1,4 @@
-syntax:glob
-conf.properties
-users.xml
-target
-*.log
+syntax:regexp
+^users\.xml$
+^conf\.xml$
+^target$
diff --git a/.project b/.project
index a0edfbb..4c8b7df 100644
--- a/.project
+++ b/.project
@@ -5,6 +5,11 @@
+
+ org.eclipse.wst.common.project.facet.core.builder
+
+
+
org.eclipse.jdt.core.javabuilder
@@ -19,5 +24,6 @@
org.eclipse.jdt.core.javanature
org.eclipse.m2e.core.maven2Nature
+ org.eclipse.wst.common.project.facet.core.nature
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index 3a63c4e..2d66f14 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -1,6 +1,9 @@
-#Wed Sep 28 23:04:47 CEST 2011
+#Sat Dec 10 17:49:06 CET 2011
eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.6
diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..bcfc325
--- /dev/null
+++ b/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/conf.sample.xml b/conf.sample.xml
new file mode 100644
index 0000000..68756c2
--- /dev/null
+++ b/conf.sample.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+ revue.txt
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
index 2025bbf..b207e9c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -73,14 +73,15 @@
2.6
- javax.xml
+ javax.xml.bind
jaxb-api
2.1
- org.quartz-scheduler
+ opensymphony
quartz
- 2.0.2
+ 1.6.2
+ runtime
org.apache.httpcomponents
@@ -104,5 +105,39 @@
1.6.1
runtime
+
+ org.scribe
+ scribe
+ 1.2.3
+
+
+ org.springframework
+ spring-context
+ 3.0.6.RELEASE
+
+
+ org.springframework
+ spring-test
+ 3.0.6.RELEASE
+ test
+
+
+ org.springframework
+ spring-context-support
+ 3.0.6.RELEASE
+ runtime
+
+
+ commons-collections
+ commons-collections
+ 3.2.1
+ runtime
+
+
+ org.springframework
+ spring-tx
+ 3.0.6.RELEASE
+ runtime
+
diff --git a/src/main/java/fr/imirhil/april/hebdobot/Application.java b/src/main/java/fr/imirhil/april/hebdobot/Application.java
index 66f8e49..49cbed7 100644
--- a/src/main/java/fr/imirhil/april/hebdobot/Application.java
+++ b/src/main/java/fr/imirhil/april/hebdobot/Application.java
@@ -1,8 +1,6 @@
package fr.imirhil.april.hebdobot;
import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileReader;
import java.util.Properties;
import org.apache.commons.io.FileUtils;
@@ -10,62 +8,37 @@ import org.joda.time.DateTime;
import org.joda.time.format.ISODateTimeFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.context.support.FileSystemXmlApplicationContext;
import fr.imirhil.april.hebdobot.irc.Bot;
import fr.imirhil.april.hebdobot.irc.ReviewListener;
import fr.imirhil.april.hebdobot.pastebin.PastebinClient;
import fr.imirhil.april.hebdobot.review.Review;
-import fr.imirhil.april.hebdobot.xml.UserAlias;
public class Application implements ReviewListener {
- private static final String USERS_FILE = "users.xml";
-
private static final Logger LOGGER = LoggerFactory
.getLogger(Application.class);
- private static final String CONF_PROPERTIES = "conf.properties";
- private static final String IRC_HOST = "irc.host";
- private static final String IRC_PORT = "irc.port";
- private static final String IRC_NICK = "irc.nick";
- private static final String IRC_CHAN = "irc.chan";
- private static final String PASTEBIN_KEY = "pastebin.key";
private static final String FILE_SUFFIX = "file.suffix";
- private final Properties properties = new Properties();
- private final Bot bot;
- private final UserAlias userAlias;
- private final String channel;
+ private final Properties properties = Context.getBean("properties");
+ private final Bot bot = Context.getBean(Bot.class);
+ private final PastebinClient pastebinClient = Context
+ .getBean(PastebinClient.class);
private Application() throws Exception {
- this.userAlias = new UserAlias(new FileInputStream(USERS_FILE));
-
- this.properties.load(new FileReader(CONF_PROPERTIES));
- final String name = this.properties.getProperty(IRC_NICK);
- this.channel = this.properties.getProperty(IRC_CHAN);
-
- this.bot = new Bot(name, this.channel);
this.bot.add(this);
}
- public void start() throws Exception {
- this.bot.connect(this.properties.getProperty(IRC_HOST),
- Integer.valueOf(this.properties.getProperty(IRC_PORT)));
- this.bot.joinChannel(this.channel);
- }
-
@Override
public void onEnd(final Review review) {
final String date = ISODateTimeFormat.basicDate().print(new DateTime());
- final String text = review.toString(this.userAlias);
- if (this.properties.containsKey(PASTEBIN_KEY)) {
- try {
- this.bot.sendMessage("Compte-rendu de la revue : "
- + new PastebinClient(this.properties
- .getProperty(PASTEBIN_KEY)).paste(text,
- "Revue APRIL " + date));
- } catch (final Exception e) {
- LOGGER.error("Error during Pastebin submit", e);
- }
+ final String text = review.toString();
+ try {
+ this.bot.sendMessage("Compte-rendu de la revue : "
+ + this.pastebinClient.paste(text, "Revue APRIL " + date));
+ } catch (final Exception e) {
+ LOGGER.error("Error during Pastebin submit", e);
}
if (this.properties.containsKey(FILE_SUFFIX)) {
@@ -83,6 +56,7 @@ public class Application implements ReviewListener {
}
public static void main(final String[] args) throws Exception {
- new Application().start();
+ new FileSystemXmlApplicationContext("conf.xml");
+ new Application();
}
}
diff --git a/src/main/java/fr/imirhil/april/hebdobot/Context.java b/src/main/java/fr/imirhil/april/hebdobot/Context.java
new file mode 100644
index 0000000..f89002a
--- /dev/null
+++ b/src/main/java/fr/imirhil/april/hebdobot/Context.java
@@ -0,0 +1,30 @@
+package fr.imirhil.april.hebdobot;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+@Component
+public final class Context implements ApplicationContextAware {
+ private static ApplicationContext CONTEXT;
+
+ @Override
+ public void setApplicationContext(
+ final ApplicationContext applicationContext) throws BeansException {
+ CONTEXT = applicationContext;
+ }
+
+ public static T getBean(final Class clazz) {
+ return CONTEXT.getBean(clazz);
+ }
+
+ public static void load() {
+ }
+
+ @SuppressWarnings("unchecked")
+ public static T getBean(final String name) {
+ return (T) CONTEXT.getBean(name);
+ }
+
+}
diff --git a/src/main/java/fr/imirhil/april/hebdobot/Job.java b/src/main/java/fr/imirhil/april/hebdobot/Job.java
new file mode 100644
index 0000000..a1e6ca9
--- /dev/null
+++ b/src/main/java/fr/imirhil/april/hebdobot/Job.java
@@ -0,0 +1,30 @@
+package fr.imirhil.april.hebdobot;
+
+import javax.annotation.Resource;
+
+import fr.imirhil.april.hebdobot.irc.Bot;
+import fr.imirhil.april.hebdobot.statusnet.IdentiCaClient;
+
+public class Job {
+ @Resource
+ private Bot bot;
+ @Resource
+ private IdentiCaClient identiCaClient;
+
+ private void notify(final String message) {
+ this.bot.sendMessage(message);
+ this.identiCaClient.post(message);
+ }
+
+ public void at30() {
+ this.notify("Revue hebdomadaire dans 30min !");
+ }
+
+ public void at45() {
+ this.notify("Revue hebdomadaire dans 15min !");
+ }
+
+ public void at55() {
+ this.notify("Revue hebdomadaire dans 5min !");
+ }
+}
diff --git a/src/main/java/fr/imirhil/april/hebdobot/irc/Bot.java b/src/main/java/fr/imirhil/april/hebdobot/irc/Bot.java
index d8b05f8..5317457 100644
--- a/src/main/java/fr/imirhil/april/hebdobot/irc/Bot.java
+++ b/src/main/java/fr/imirhil/april/hebdobot/irc/Bot.java
@@ -12,14 +12,29 @@ import fr.imirhil.april.hebdobot.review.Review;
import fr.imirhil.april.hebdobot.review.Topic;
public class Bot extends PircBot {
- private Review review = null;
+ private final String host;
+ private final int port;
private final String channel;
+ private Review review = null;
private final Collection listeners =
new LinkedList();
- public Bot(final String name, final String channel) {
- this.setName(name);
+ public Bot(final String host, final int port, final String name,
+ final String channel) {
+ this.host = host;
+ this.port = port;
this.channel = channel;
+ this.setName(name);
+ }
+
+ public void init() throws Exception {
+ this.connect(this.host, this.port);
+ this.joinChannel(this.channel);
+ }
+
+ public void close() {
+ this.disconnect();
+ this.dispose();
}
public void add(final ReviewListener listener) {
@@ -85,8 +100,7 @@ public class Bot extends PircBot {
return false;
}
- this.disconnect();
- this.dispose();
+ this.close();
return true;
}
diff --git a/src/main/java/fr/imirhil/april/hebdobot/pastebin/PastebinClient.java b/src/main/java/fr/imirhil/april/hebdobot/pastebin/PastebinClient.java
index 495f747..68901f4 100644
--- a/src/main/java/fr/imirhil/april/hebdobot/pastebin/PastebinClient.java
+++ b/src/main/java/fr/imirhil/april/hebdobot/pastebin/PastebinClient.java
@@ -42,18 +42,18 @@ public class PastebinClient {
}
}
- private final String apiDevKey;
+ private final String apiKey;
private String apiUserKey = null;
HttpClient httpClient = new DefaultHttpClient();
- public PastebinClient(final String apiDevKey) {
- this.apiDevKey = apiDevKey;
+ public PastebinClient(final String apiKey) {
+ this.apiKey = apiKey;
}
public void login(final String name, final String password)
throws Exception {
final List params = new LinkedList();
- setParameter(params, API_DEV_KEY, this.apiDevKey);
+ setParameter(params, API_DEV_KEY, this.apiKey);
setParameter(params, API_USER_NAME, name);
setParameter(params, API_USER_PASSWORD, password);
@@ -72,7 +72,7 @@ public class PastebinClient {
final Format format, final boolean privat,
final Expiration expiration) throws Exception {
final List params = new LinkedList();
- setParameter(params, API_DEV_KEY, this.apiDevKey);
+ setParameter(params, API_DEV_KEY, this.apiKey);
setParameter(params, API_USER_KEY, this.apiUserKey);
setParameter(params, API_OPTION, Option.PASTE.getValue());
setParameter(params, API_PASTE_PRIVATE, privat ? "1" : "0");
diff --git a/src/main/java/fr/imirhil/april/hebdobot/review/Review.java b/src/main/java/fr/imirhil/april/hebdobot/review/Review.java
index 1fa510b..11728ff 100644
--- a/src/main/java/fr/imirhil/april/hebdobot/review/Review.java
+++ b/src/main/java/fr/imirhil/april/hebdobot/review/Review.java
@@ -9,11 +9,14 @@ import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
+import fr.imirhil.april.hebdobot.Context;
import fr.imirhil.april.hebdobot.xml.UserAlias;
public class Review {
private static final int LENGTH = 80;
+ private static final UserAlias USER_ALIAS = Context
+ .getBean(UserAlias.class);
private final Set participants = new HashSet();
private final List individualTopics =
new LinkedList();
@@ -60,7 +63,8 @@ public class Review {
this.messages.add(message);
}
- public String toString(final UserAlias userService) {
+ @Override
+ public String toString() {
final StringBuffer buffer = new StringBuffer();
addLine(buffer, '=');
addCenter(buffer, "Revue de la semaine en cours");
@@ -74,7 +78,7 @@ public class Review {
addEmpty(buffer);
addCenter(buffer, "Participants", '-');
for (final String participant : this.participants) {
- addChunk(buffer, "* " + userService.getRealName(participant) + "\n");
+ addChunk(buffer, "* " + USER_ALIAS.getRealName(participant) + "\n");
}
if (!this.individualTopics.isEmpty()) {
@@ -82,7 +86,7 @@ public class Review {
addEmpty(buffer);
addLine(buffer, '=');
addEmpty(buffer);
- addCenter(buffer, userService.getRealName(participant), '-');
+ addCenter(buffer, USER_ALIAS.getRealName(participant), '-');
for (final IndividualTopic topic : this.individualTopics) {
if (topic.hasParticipant(participant)) {
addEmpty(buffer);
diff --git a/src/main/java/fr/imirhil/april/hebdobot/statusnet/Client.java b/src/main/java/fr/imirhil/april/hebdobot/statusnet/Client.java
deleted file mode 100644
index 1b07ba8..0000000
--- a/src/main/java/fr/imirhil/april/hebdobot/statusnet/Client.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package fr.imirhil.april.hebdobot.statusnet;
-
-public class Client {
-
-}
diff --git a/src/main/java/fr/imirhil/april/hebdobot/statusnet/IdentiCaApi.java b/src/main/java/fr/imirhil/april/hebdobot/statusnet/IdentiCaApi.java
new file mode 100644
index 0000000..e2e96b3
--- /dev/null
+++ b/src/main/java/fr/imirhil/april/hebdobot/statusnet/IdentiCaApi.java
@@ -0,0 +1,31 @@
+package fr.imirhil.april.hebdobot.statusnet;
+
+import org.scribe.builder.api.DefaultApi10a;
+import org.scribe.model.Token;
+
+public class IdentiCaApi extends DefaultApi10a {
+ private static final String IDENTI_CA_OAUTH_API_URL =
+ "https://identi.ca/api/oauth";
+ private static final String IDENTI_CA_OAUTH_API_REQUEST_TOKEN_URL =
+ IDENTI_CA_OAUTH_API_URL + "/request_token";
+ private static final String IDENTI_CA_OAUTH_API_ACCESS_TOKEN_URL =
+ IDENTI_CA_OAUTH_API_URL + "/access_token";
+ private static final String IDENTI_CA_OAUTH_API_AUTHORIZE_URL =
+ IDENTI_CA_OAUTH_API_URL + "/authorize?oauth_token=%s";
+
+ @Override
+ public String getRequestTokenEndpoint() {
+ return IDENTI_CA_OAUTH_API_REQUEST_TOKEN_URL;
+ }
+
+ @Override
+ public String getAccessTokenEndpoint() {
+ return IDENTI_CA_OAUTH_API_ACCESS_TOKEN_URL;
+ }
+
+ @Override
+ public String getAuthorizationUrl(final Token requestToken) {
+ return String.format(IDENTI_CA_OAUTH_API_AUTHORIZE_URL,
+ requestToken.getToken());
+ }
+}
diff --git a/src/main/java/fr/imirhil/april/hebdobot/statusnet/IdentiCaClient.java b/src/main/java/fr/imirhil/april/hebdobot/statusnet/IdentiCaClient.java
new file mode 100644
index 0000000..8accd19
--- /dev/null
+++ b/src/main/java/fr/imirhil/april/hebdobot/statusnet/IdentiCaClient.java
@@ -0,0 +1,21 @@
+package fr.imirhil.april.hebdobot.statusnet;
+
+
+public class IdentiCaClient extends StatusNetClient {
+ private static final Class API_CLASS = IdentiCaApi.class;
+ private static final String IDENTICA_API_URL = "https://identi.ca/api";
+
+ public IdentiCaClient(final String apiKey, final String apiSecret,
+ final String tokenKey, final String tokenSecret) {
+ super(API_CLASS, apiKey, apiSecret, tokenKey, tokenSecret);
+ }
+
+ public static void register(final String apiKey, final String apiSecret) {
+ StatusNetClient.register(API_CLASS, apiKey, apiSecret);
+ }
+
+ @Override
+ protected String getApiUrl() {
+ return IDENTICA_API_URL;
+ }
+}
diff --git a/src/main/java/fr/imirhil/april/hebdobot/statusnet/StatusNetClient.java b/src/main/java/fr/imirhil/april/hebdobot/statusnet/StatusNetClient.java
new file mode 100644
index 0000000..322d9a4
--- /dev/null
+++ b/src/main/java/fr/imirhil/april/hebdobot/statusnet/StatusNetClient.java
@@ -0,0 +1,52 @@
+package fr.imirhil.april.hebdobot.statusnet;
+
+import java.util.Scanner;
+
+import org.scribe.builder.ServiceBuilder;
+import org.scribe.builder.api.Api;
+import org.scribe.model.OAuthRequest;
+import org.scribe.model.Token;
+import org.scribe.model.Verb;
+import org.scribe.model.Verifier;
+import org.scribe.oauth.OAuthService;
+
+public abstract class StatusNetClient {
+ private final OAuthService service;
+ private final Token token;
+
+ public StatusNetClient(final Class extends Api> apiClass,
+ final String apiKey, final String apiSecret, final String tokenKey,
+ final String tokenSecret) {
+ this.service = getService(apiClass, apiKey, apiSecret);
+ this.token = new Token(tokenKey, tokenSecret);
+ }
+
+ private static OAuthService getService(final Class extends Api> apiClass,
+ final String apiKey, final String apiSecret) {
+ return new ServiceBuilder().provider(apiClass).apiKey(apiKey)
+ .apiSecret(apiSecret).build();
+ }
+
+ public static void register(final Class extends Api> apiClass,
+ final String apiKey, final String apiSecret) {
+ final OAuthService service = getService(apiClass, apiKey, apiSecret);
+ final Token requestToken = service.getRequestToken();
+ System.out.println(service.getAuthorizationUrl(requestToken));
+ System.out.print(">>");
+ final Scanner scanner = new Scanner(System.in);
+ Verifier verifier = new Verifier(scanner.nextLine());
+ final Token token = service.getAccessToken(requestToken, verifier);
+ System.out.println(token);
+ }
+
+ public void post(final String message) {
+ final OAuthRequest request =
+ new OAuthRequest(Verb.POST, this.getApiUrl()
+ + "/statuses/update.json");
+ request.addBodyParameter("status", message);
+ this.service.signRequest(this.token, request);
+ request.send();
+ }
+
+ protected abstract String getApiUrl();
+}
diff --git a/src/test/java/fr/imirhil/april/hebdobot/irc/BotTest.java b/src/test/java/fr/imirhil/april/hebdobot/irc/BotTest.java
new file mode 100644
index 0000000..162ac5c
--- /dev/null
+++ b/src/test/java/fr/imirhil/april/hebdobot/irc/BotTest.java
@@ -0,0 +1,86 @@
+package fr.imirhil.april.hebdobot.irc;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.io.FileUtils;
+import org.joda.time.DateTime;
+import org.joda.time.format.ISODateTimeFormat;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import fr.imirhil.april.hebdobot.review.Review;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = "/fr/imirhil/april/hebdobot/conf.xml")
+public class BotTest implements ReviewListener {
+ private static class BotMock extends Bot {
+ public BotMock() throws Exception {
+ super("", 0, "bot", "channel");
+ }
+
+ @Override
+ public void
+ onMessage(final String channel, final String sender,
+ final String login, final String hostname,
+ final String message) {
+ super.onMessage(channel, sender, login, hostname, message);
+ }
+ }
+
+ @Test
+ public void redo() throws Exception {
+ final Bot bot = new BotMock();
+ bot.add(this);
+
+ final InputStream is =
+ BotTest.class
+ .getResourceAsStream("/fr/imirhil/april/hebdobot/review.log");
+ try {
+ final Reader isr = new InputStreamReader(is);
+ try {
+ final BufferedReader isbr = new BufferedReader(isr);
+ try {
+ String line;
+ final Pattern pattern =
+ Pattern.compile(".*\\s+<([^>]+)>\\s+(.*)");
+ while ((line = isbr.readLine()) != null) {
+ final Matcher matcher = pattern.matcher(line);
+ if (matcher.matches()) {
+ bot.onMessage("channel", matcher.group(1), "", "",
+ matcher.group(2));
+ }
+ }
+ } finally {
+ isbr.close();
+ }
+
+ } finally {
+ isr.close();
+ }
+ } finally {
+ is.close();
+ }
+ }
+
+ @Override
+ public void onEnd(final Review review) {
+ try {
+ final String date =
+ ISODateTimeFormat.basicDate().print(new DateTime());
+ final String text = review.toString();
+ final File file = new File("target/" + date + "_revue.txt");
+ FileUtils.writeStringToFile(file, text);
+ } catch (final IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/src/test/java/fr/imirhil/april/hebdobot/pastebin/PastebinClientTest.java b/src/test/java/fr/imirhil/april/hebdobot/pastebin/PastebinClientTest.java
new file mode 100644
index 0000000..4560cab
--- /dev/null
+++ b/src/test/java/fr/imirhil/april/hebdobot/pastebin/PastebinClientTest.java
@@ -0,0 +1,13 @@
+package fr.imirhil.april.hebdobot.pastebin;
+
+import org.junit.Test;
+
+public class PastebinClientTest {
+ private final PastebinClient client = new PastebinClient(
+ "b95ea42d539ec9dca02a7da1f5b229c7");
+
+ @Test
+ public void testPaste() throws Exception {
+ System.out.println(this.client.paste("ééé", Expiration.MINUTE_10));
+ }
+}
diff --git a/src/test/resources/fr/imirhil/april/hebdobot/conf.xml b/src/test/resources/fr/imirhil/april/hebdobot/conf.xml
new file mode 100644
index 0000000..25611ac
--- /dev/null
+++ b/src/test/resources/fr/imirhil/april/hebdobot/conf.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+ revue.txt
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/fr/imirhil/april/hebdobot/review.log b/src/test/resources/fr/imirhil/april/hebdobot/review.log
new file mode 100644
index 0000000..b203896
--- /dev/null
+++ b/src/test/resources/fr/imirhil/april/hebdobot/review.log
@@ -0,0 +1,166 @@
+2011-09-02 12:00:36 !debut
+2011-09-02 12:00:36 % rappel : toute ligne commençant par % ne sera considérée comme un commentaire et non prise en compte dans la synthèse
+2011-09-02 12:00:36 # 1/ Actions passées ou en cours % quand vous avez fini vous le dites par
+2011-09-02 12:00:36 % fini
+2011-09-02 12:00:55 * coinpan (500c6ecb@gateway/web/freenode/ip.80.12.110.203) a rejoint #april
+2011-09-02 12:00:59 coin
+2011-09-02 12:01:03 <_PoLuX_> Institutionnel : travail sur consultation cloud
+2011-09-02 12:01:10 % coinpan : pile à temps, on démarre :)
+2011-09-02 12:01:10 cloud : fin de la réponse à la consultation européenne
+2011-09-02 12:01:15 <_PoLuX_> Institutionnel : remarques sur tv connectée
+2011-09-02 12:01:19 cloud note en cours
+2011-09-02 12:01:24 commande cartes de visites pour _PoLuX_
+2011-09-02 12:01:27 Initiatives Candidats.fr: amélioration de la plate-forme
+2011-09-02 12:01:34 Suivi achat portable Jeanne
+2011-09-02 12:01:34 cloud : mise en ligne de la consultation
+2011-09-02 12:01:37 dépot chèque à la banque
+2011-09-02 12:01:41 cloud : finalisation réponse consultation européenne, envoi, mise en ligne de la réponse sur le site de l'April
+2011-09-02 12:01:42 Création d'un compte SVN pour galilea
+2011-09-02 12:01:46 Divers relectures
+2011-09-02 12:01:48 <_PoLuX_> Suivi divers en trésorerie
+2011-09-02 12:01:54 cloud : remerciement des participants
+2011-09-02 12:01:55 traductions : relayé l'appel à trad de Simon Descarpentries (livre Eloquent Javascript)
+2011-09-02 12:01:56 TV connectée : suite préparation réponse de l'April
+2011-09-02 12:01:58 %fini
+2011-09-02 12:02:11 traductions : publié traduction relue (déclaration d'utilisation de LL)
+2011-09-02 12:02:16 %oups je suis en retard
+2011-09-02 12:02:18 agenda 2020 : bilan en cours 2012
+2011-09-02 12:02:25 <_PoLuX_> Entretient avec Antoine Chao + CR
+2011-09-02 12:02:26 Formats ouverts : préparation de l'actu sur la généralisation des standards ouverts dans l'administration
+2011-09-02 12:02:32 prise de contact avec nouveau fournisseur poru les t-shirts
+2011-09-02 12:02:33 réu dossier instit/réunion d'équipe
+2011-09-02 12:02:35 % teymour : on en est encore aux activités semaine passée
+2011-09-02 12:02:38 <_PoLuX_> Relances diverses sur projet de guide libreasso
+2011-09-02 12:02:42 format ouverts push des infos
+2011-09-02 12:02:42 pt déj dossiers institutionnels
+2011-09-02 12:02:46 traductions : rédaction d'une niouze pour la publication de nouvelles trad + demande de publication
+2011-09-02 12:02:48 Réunion dossiers institutionnels / point d'équipe
+2011-09-02 12:02:49 appel à particpation pour la braderie de lille
+2011-09-02 12:02:53 %fini
+2011-09-02 12:02:57 rapport d'étonnement 1 mois de stage
+2011-09-02 12:02:58 RPVA rdv ministère de la justice + récupération d'infos
+2011-09-02 12:02:59 crétaion page wiki braderie de lille
+2011-09-02 12:03:06 <_PoLuX_> Préparation du stand pour la braprendre rdv avec le conseiller credit mut derie de lille
+2011-09-02 12:03:07 %fini
+2011-09-02 12:03:09 entretien journaliste sur Hadopi
+2011-09-02 12:03:18 <_PoLuX_> Suivi divers pour le CA
+2011-09-02 12:03:19 Loop suiv et correction du draft de _PoluX_
+2011-09-02 12:03:22 petit dèj institutionnel
+2011-09-02 12:03:26 examen compétence hadopi sur accès aux info essentielles d'interop
+2011-09-02 12:03:31 petit déjeuner point d'équipe
+2011-09-02 12:03:34 envoi du courriel Loop au CA en cours
+2011-09-02 12:03:35 <_PoLuX_> Proposition de lettre de soutien au loop
+2011-09-02 12:03:39 %fini
+2011-09-02 12:04:00 discussions sur le bilan France Numérique 2012 et réponse à la consultation france numérique 2020
+2011-09-02 12:04:02 mise a jour bilan financier des rmll
+2011-09-02 12:04:14 suivi reprise des travaux parlementaires (et réponses aux QE)
+2011-09-02 12:04:23 routing d'un appel journaliste RFI sur HADOPI vers axx_ de LQDN
+2011-09-02 12:04:23 <_PoLuX_> Participation au petit dej institutionnel
+2011-09-02 12:04:27 commabde d'affiches et catalibre pour le stand de la braderie de lille
+2011-09-02 12:04:41 % teymour : c'était Clare ?
+2011-09-02 12:04:49 <_PoLuX_> % fini
+2011-09-02 12:05:10 %janchou oui elle m'a rappelé en fin de semaine derenière. Tu l'as rajoutée dans les contacts presse ou il faut que je le fasse ?
+2011-09-02 12:05:21 relecture Cloud Computing
+2011-09-02 12:05:41 % teymour : je m'en occupe (je l'ai vue mardi)
+2011-09-02 12:05:42 prise de rdv avec le conseiller bancaire
+2011-09-02 12:05:59 % janchou galilea pour info, on m'a fait des compliments sur le draft de note sur le cloud ce matin
+2011-09-02 12:06:20 %teymour :)
+2011-09-02 12:06:30 %janchou cool pour Clare, je pensais qu'elle avait laché l'affaire avec nous pour son sujet
+2011-09-02 12:06:36 gestion relance 1er septembre
+2011-09-02 12:06:45 commande d'un livre sur Drupal chez Eyrolles ^^
+2011-09-02 12:06:46 %fini
+2011-09-02 12:06:48 gestion radiation 1er septembre
+2011-09-02 12:06:52 % fini
+2011-09-02 12:07:10 mise a jour lettre interne
+2011-09-02 12:07:29 % fini
+2011-09-02 12:07:39 mise à jour lettre interme
+2011-09-02 12:07:42 % fini pour de vrai
+2011-09-02 12:07:53 % fini
+2011-09-02 12:08:13 % on va passer à la suite : Actions à venir
+2011-09-02 12:08:13 # 2/ Actions à venir
+2011-09-02 12:08:13 % quand vous avez fini vous le dites par % fini
+2011-09-02 12:08:23 <_PoLuX_> Participation Braderie de Lille
+2011-09-02 12:08:27 revue de presse
+2011-09-02 12:08:29 cloud : relecture de la note
+2011-09-02 12:08:30 cloud : note en cours
+2011-09-02 12:08:31 Réception/configuration éventuelle portable Jeanne
+2011-09-02 12:08:33 <_PoLuX_> Rédaction du guide libreasso
+2011-09-02 12:08:38 4 questions à responsable de groupe
+2011-09-02 12:08:43 <_PoLuX_> Relance des contributeurs pour libreasso
+2011-09-02 12:08:46 Améliorations initiatives candidats.fr
+2011-09-02 12:08:48 TV connectée : envoi de la réponse à l'appel à contribution
+2011-09-02 12:08:49 mise à jour cahiers candidats. fr
+2011-09-02 12:09:00 france numérique : suite discussion, préparation réponse
+2011-09-02 12:09:01 agenda numérique 2020
+2011-09-02 12:09:11 marchés publics : conférence à l'AMIF
+2011-09-02 12:09:11 <_PoLuX_> + Suivi divers et dépillage post-été
+2011-09-02 12:09:14 traductions : faire une trad
+2011-09-02 12:09:16 * xpo est parti (Quit: xpo)
+2011-09-02 12:09:17 RPVA: voir pour les contacts
+2011-09-02 12:09:18 pointage compta aout
+2011-09-02 12:09:23 traductions : générer un nouveau listing de documents àtraduire
+2011-09-02 12:09:25 %fini
+2011-09-02 12:09:29 RPVA : suivi contacts
+2011-09-02 12:09:33 Formation SVN Marie
+2011-09-02 12:09:33 %fini
+2011-09-02 12:09:34 RPVA contacts
+2011-09-02 12:09:35 vente liée : diverses relances
+2011-09-02 12:09:35 comprendre SVN
+2011-09-02 12:09:35 %fini
+2011-09-02 12:09:36 %fini pour de vrai
+2011-09-02 12:09:44 Cloud relecture
+2011-09-02 12:09:47 % galilea : impossible :)
+2011-09-02 12:09:52 %fini
+2011-09-02 12:09:52 % galilea bonne chance :)
+2011-09-02 12:10:02 %/me aime les défis
+2011-09-02 12:10:03 Marchés public, mettre en relation janchou avec Justice
+2011-09-02 12:10:05 % l'espoir fait vivre
+2011-09-02 12:10:10 suivi bounce aout et septembre
+2011-09-02 12:10:18 ACTA : mise à jour sur le site de l'April
+2011-09-02 12:10:23 suivi relance
+2011-09-02 12:10:30 mettre nouveaux contacts dans dotproject
+2011-09-02 12:10:45 Envoi lettre Loop
+2011-09-02 12:10:56 contacter ppsj pour arret
+2011-09-02 12:11:17 france numérique : envoyer commentaire sur le projet de consultation
+2011-09-02 12:11:33 vente liée : finalisation / validation de la synthèse ?
+2011-09-02 12:11:46 %fini
+2011-09-02 12:11:48 % fini
+2011-09-02 12:12:12 % teymour fini ?
+2011-09-02 12:12:16 %fini
+2011-09-02 12:12:27 % on va passer à la suite : Points de blocage
+2011-09-02 12:12:27 ## 3/ Points de blocage existants ou levés cette semaine
+2011-09-02 12:12:27 % si rien à dire vous dites %ras
+2011-09-02 12:12:38 laptop : en cours de résolution
+2011-09-02 12:12:49 %ras
+2011-09-02 12:12:55 %ras
+2011-09-02 12:12:56 prendre rdv avec le conseiller credit mut > réglé
+2011-09-02 12:12:56 Débloqué bug javascript/json bloquant pour les initiatives
+2011-09-02 12:13:08 %ras
+2011-09-02 12:13:14 Recu confirmation livraison laptop
+2011-09-02 12:13:16 %fini
+2011-09-02 12:13:46 oubli de la braderie de lille, appel à participation tardif
+2011-09-02 12:14:11 % on va passer à la suite : Points Forts et Points de Vigilance de la réunion
+2011-09-02 12:14:12 ## 4/ Points forts de la réunion
+2011-09-02 12:14:12 % 1 mn max
+2011-09-02 12:14:12 % si rien à dire vous dites %ras
+2011-09-02 12:14:25 toujours aussi rapide et motivant
+2011-09-02 12:14:30 beaucoup de présents, effet rentrée ?
+2011-09-02 12:14:41 beaucoup de boulot aussi
+2011-09-02 12:14:44 * _bibi (~obibi@office.bearstech.com) a rejoint #april
+2011-09-02 12:15:02 du boulot on s'ennuie pas !
+2011-09-02 12:15:07 %fini
+2011-09-02 12:15:16 Retour de plein de gens
+2011-09-02 12:15:22 * _bibi (~obibi@office.bearstech.com) a quitté #april
+2011-09-02 12:15:26 %trop bien le stage :)
+2011-09-02 12:15:29 % on va passer à la suite : Points de Vigilance de la réunion
+2011-09-02 12:15:29 ## 5/ Points de vigilance de la réunion
+2011-09-02 12:15:29 % si rien à dire vous dites
+2011-09-02 12:15:29 %ras % 1 mn max
+2011-09-02 12:15:36 %ras
+2011-09-02 12:15:48 %ras
+2011-09-02 12:16:02 % galilea tu dira plus ça quand tu aura ouvert svn :P
+2011-09-02 12:16:05 % galilea : oui, tu apprends plein de trucs techniques... /o\
+2011-09-02 12:16:26 %ras
+2011-09-02 12:16:26 % Fin de la revue hebdomadaire, merci à vous
+2011-09-02 12:16:26 % Pensez à noter votre bénévalo : http://www.april.org/my?action=benevalo
+2011-09-02 12:16:26 !fin
diff --git a/src/test/resources/fr/imirhil/april/hebdobot/users.xml b/src/test/resources/fr/imirhil/april/hebdobot/users.xml
new file mode 100644
index 0000000..8d602a4
--- /dev/null
+++ b/src/test/resources/fr/imirhil/april/hebdobot/users.xml
@@ -0,0 +1,3 @@
+
+
diff --git a/users.sample.xml b/users.sample.xml
new file mode 100644
index 0000000..8cb1899
--- /dev/null
+++ b/users.sample.xml
@@ -0,0 +1,8 @@
+
+
+
+ Foo Bar
+ foo
+ foo_
+
+