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 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 apiClass, + final String apiKey, final String apiSecret) { + return new ServiceBuilder().provider(apiClass).apiKey(apiKey) + .apiSecret(apiSecret).build(); + } + + public static void register(final Class 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_ + +