Giter Site home page Giter Site logo

exobrain's Introduction

Build Status

Support via Gittip

What is this?

Exobrain is a collection of agents which collect, classify, and act upon data. They share a common bus for communication. Think of it as IFTTT, but free, open source, and you keep control of your privacy.

Examples of things that exobrain can currently do:

  • Give you XP in HabitRPG when you update your beeminder goals
  • Let others add items to your RememberTheMilk TODO lists via twitter
  • Update beeminder by checking your inbox sizes using IMAP
  • Reward you for responding to email
  • Automatically log life events to idonethis

You can find pre-built actions in the bin/actions directory.

Exobrain is designed to make it very easy to write and trigger events using standard interfaces.

Technology

The core of exobrain is written in Perl, but uses a shared message bus (0MQ) and packet format (JSON) to make it easy to connect components from other languages.

Writing an action is a very simple affair. For example, @pjf has notifications configured to go to his pebble watch, and uses this code to send all tweets directed at him to said watch:

#!/usr/bin/env perl
use Exobrain;

my $exobrain = Exobrain->new;

$exobrain->watch_loop(
    class  => 'Measurement::Tweet',
    filter => sub { $_->to_me },
    then   => sub {
        $exobrain->notify( $_->summary );
    },
);

Docker support

Docker support is still experimental, but the following should let you skip steps 1-3 of the installation instructions below. An Ubuntu host is assumed.

$ sudo apt-get install docker.io
$ sudo docker.io run -i -t pjf0/exobrain sudo -i -u exobrain

Installation

Step 1: Install exobrain

The following works for a fresh install of Ubuntu 13.10.

Firstly, make sure you've got all the dependencies:

$ sudo apt-get install libzmq3-dev libexpat-dev libnet-ssleay-perl \
    libnet-libidn-perl libcrypt-ssleay-perl cpanminus make \
    liblocal-lib-perl

Exobrain can use either ZMQ2 or ZMQ3, but we prefer ZMQ3:

export PERL_ZMQ_BACKEND=ZMQ::LibZMQ3

Configure local::lib if you haven't already done so:

$ perl -Mlocal::lib >> ~/.bashrc
$ eval $(perl -Mlocal::lib)

If installing from git, you can then use:

$ dzil authordeps | cpanm
$ dzil listdeps   | cpanm
$ dzil install

If installing from CPAN, it's just:

$ cpanm Exobrain

Note that Exobrain has many dependencies. If you're feeling hungry, this would be a good time to go out for a meal or find a snack. You can also use cpanm --notest instead of cpanm in all the lines above, which will get things installed sooner by not rigorously testing Exobrain and every one of its dependencies.

When you return from your meal, you should find that you have exobrain installed! However to use it properly, you'll want to manage it with ubic.

Step 2: Configure ubic

Set up ubic (if you haven't already done so):

$ ubic-admin setup

Set up exobrain:

$ exobrain setup

It's a good idea to run exobrain setup any time you upgrade your version of Exobrain.

Step 3: Install extensions

Exobrain provides extensions to plug into third party services. They're bundled separately on the CPAN. After installing each one, you'll wish to use the exobrain setup command on its short name to configure it. For example, to install the Twitter extensions:

$ cpanm Exobrain::Twitter
$ exobrain setup Twitter

You can find Exobrain extensions on the CPAN

Step 4: Add configuration

Exobrain uses a ~/.exobrainrc file. You can copy the example.exobrainrc file from the docs/ directory to get started. Exobrain will also use config files found in your ~/.config/exobrain directory (or the XDG config directory on your system). Installable components will often write their configuration to this area.

For RememberTheMilk integration, you'll need a valid ~/.rtmagent file.

You can now start your exobrain. You can see what exobrain services you have available with:

$ ubic status

The exobrain core must always be running for anything to work. You can start it with:

$ ubic start exobrain.core

If you've configured Twitter, or another extension, you can start that with:

$ ubic start exobrain.twitter

While the exobrain.action services are slowly being replaced with dedicated agent classes, many of them are useful, especially for testing. You can start the ping service with:

$ ubic start exobrain.action.ping

DEBUGGING

If things don't seem to be working right, you start up the debugger:

$ exobrain debug        # Watch the exobrain bus
$ exobrain debug -v     # Watch the exobrain bus verbosely

These commands will show you what's happening right now. If things are quiet, then nothing will be shown.

You can also look at the files in ~/ubic/log/exobrain. Often these will reveal problems such as missing or incorrect configuration and the like.

GLOSSARY

An exobrain source is a data provider. It integrates with some external service, and produces Measurements. These can be events on social media, inbox counts, check-ins, call-backs, or anything else which is bringing data into the system.

An exobrain sink is a data consumer. It listens for intents and makes them happen. This may be sending a tweet, recording a TODO item, sending a notification, updating a data-point, etc.

An exobrain action bridges sources and sinks. It listens for measurements, and produces intents. These are the most common components, and also the easiest to write.

BUGS

Heaps. Report and/or fix them at https://github.com/pjf/exobrain/issues/

SUPPORT

You can join us on #exobrain on chat.freenode.net (IRC).

We have a mailing list at http://groups.google.com/d/forum/exobrain .

If you like my work, you can tip me on gittip.

If you wish to see Exobrain features implemented more quickly, you can place bounties on Bountysource.

All code contributions, tests, bug reports, feature ideas, documentation, and anything else are extremely welcome! Exobrain is free and open source software, please use it to make the world a better place.

Exobrain is hosted on github.

LICENSE

Same as Perl 5 itself.

exobrain's People

Contributors

ambs avatar mmcclimon avatar pjf avatar rickmeasham avatar zsyed91 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

exobrain's Issues

Improve intent interface

Right now all the intents do some ridiculous wrapping around BUILDARGS, setting timestamps and summaries and whatnot. Most of this is boilerplate, we should get rid of and have the role (or anything else) do it for us.

It may be wise to have a separate Intent role for this purpose, rather than trying to smoosh Exobrain::Message into the job.

Debian Wheezy / Raspberry Pi instructions

Exobrain core does indeed run on the RPi!
It's really slow, and would probably benefit from PersistentPerl.
It's easily a seven hour install, so If this is a headless box, use screen so you can detatch.

Instructions:
First problem: ZMQ3 doesn't have a package in debian/raspbian wheezy, you'll need install from source, don't install any zmq* packages, everything is in the source. (use screen, this can take a while)
I tried a few different combinations of packages and installers, In the end I blew it away and did this:
$wget http://Download.zeromq.org/zeromq-3.2.4.tar.gz
$tar zxvf zeromq-3.2.4.tar.gz
and in the new zeromq directory:
$sudo ./configure; sudo make; sudo make install; sudo ldconfig
It turns out that ldconfig (the linker) was important (who knew?)

The rest is from the normal instructions:
$sudo apt-get install libexpat-dev libnet-ssleay-perl libnet-libidn-perl libcrypt-ssleay-perl cpanminus make liblocal-lib-perl
(I'll emphasise, using screen here!)
$sudo cpanm Exobrain
Forget the pizza, hit the town and come back tomorrow.
$ubic start exobrain.core

For me, the actions wouldn't start because ~/ubic/service/exobrain was not marked executable.
$chmod u+x ~/ubic/service/exobrain makes it all better.
$ubic start exobrain.action.ping

Installing exobrain::Twitter
Net::Twitter has a non-numeric version dependency, which chrashes cpanm, I had to setup cpan to install it. (setting up cpan takes longer than installing the module. use screen here too.)

That's as far as I've installed it, I'll add more here later when I come to it.


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Sending Message to Bus fails if called Too Soon

Credit to @pjf as his brain wave figured it out. Code to duplicate the issue:

#!/usr/bin/env perl
use Exobrain;

my $exobrain = Exobrain->new;

$exobrain->notify("Hello World");
sleep(1);
$exobrain->notify("Hello World 2");

Results in only "Hello World 2" making it to the notification service.


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Reduce Exobrain's memory usage

Exobrain agents seem to take up a lot of memory. It'd be really good to profile
why they're using up so much. Some of these are almost certainly memory
leaks, although some things (like ubic-guardian runs) are likely gobbling up
a lot of memory through needless library loads and similar.


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Create an exobrain org

To expand out and better organise the code and packaging the project should have a github org

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1909824-create-an-exobrain-org?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

Configure a default notify point for Exobrain

Otherwise they just get lost when notifies occur.

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1429984-configure-a-default-notify-point-for-exobrain?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

IPC::System::Simple dependency

Hi Paul,

While running:

§ exobrain setup

I got:

IPC::System::Simple required for Fatalised/autodying system() at /home/rjc/perl5/bin/exobrain line 9.
BEGIN failed--compilation aborted at /home/rjc/perl5/bin/exobrain line 9

The problem obviously went away after installing libipc-system-simple-perl package.

It might be worth adding the above package to the apt-get install part in the README or perhaps make sure Exobrain depends on it?

Ta,

rjc

Launcher config

List all services that should be running.

Monitoring, etc?

Offer a turn-key virtual machine image

It would be really awesome to have a turn-key virtual machine image people can use. Then people can just use AWS/Azure/OpenStack/Whatever to get running.

Bonus points if this includes a web interface for configuration. (Which also makes a lot of OAuth dances easier to acheive)


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Add pocket support

Writing to pocket automatically based upon twitter / facebook posts sound good.

Reading from pocket to publish interesting articles is also cool. :)

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1388238-add-pocket-support?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

Add a response method

It's easy to process something that comes from social media, we just hook the Measurement::Social role. But it's much harder to respond to that. Social-media dependent responses currently requiring an Intent for the platform in question, which means having it available to load, which means dependencies.

For example, the RTM<->Twitter bridge depends upon both RTM and Twitter. It should only need one, the other, or neither, as conceptually it's connecting TODO frames to Social Frames.

In the same way that we have a platform agnostic $exobrain->notify method, we need a $exobrain->respond method. It needs to take:

  • An identifier of what we're responding to. (A status, tweet, etc)
  • The user we're responding to.
  • The platform on which this response is happening.

This means we can have generic responses to the social messages we already receive, which will decouple things nicely. Obviously we'll need a Agent::Twitter::Responder or and the like, but those are simple matters of code.

Notifications containing hashes are truncated

As best as I can tell, this is a bug with WebService::Pushover, but it needs confirmation.

See hakamadare/webservice-pushover#7

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1427437-notifications-containing-hashes-are-truncated?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

Add docs to Exobrain.pm / exobrain

Because Exobrain.pm is where people are most likely to land when they search on the CPAN, it should have a full set of docs attached to it. These may refer the user to Exobrain::FAQ, or Exobrain::Manual (if we create those), but it should give them enough to know what this is, and why they might use it.

The exobrain ubic configuration file may also be a landing point for users. I'll pop that in another ticket, because we want to tweak that anyway.


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Add support for Log::Log4perl

Log4perl is utterly brilliant, and fits well with the exobrain methodology of being able to dynamic react to things. (You can change logging options on the fly for running processes.)

We should move Exobrain over to using it, as it's much nicer than our quick'n'dirty logging with Ubic.

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1430288-add-support-for-log-log4perl?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

Feature: Integrate tagtime

I want stochastic pings, please.

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1388244-feature-integrate-tagtime?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

Add Travis CI testing

This should not only let us know about issues in commits, but also may be able to pick up on upstream dependency bugs.

Race conditions when first connecting to the bus

From #52, there appears to be a condition where we can try to send things across the bus before it's fully connected. This is definitely something which can happen with ZMQ, and may be seen with something like:

use Exobrain;
my $exobrain = Exobrain->new;
$exobrain->notify("Hello World 1");
sleep(1);
$exobrain->notify("Hello World 2");

Solutions could be:

  • Provide a $exobrain->connect or equivalent message to make sure we're actually connected to the bus. We'd need to say if we're going to be subscribing or publishing; so it may make sense to just call $exobrain->sub or $exobrain->pub` (which already exist, and will initiate the connection).
  • Actually be able to mark packets as important (eg, with intents), or configure a basic buffer that needs to fill before they get dropped (which is probably sufficient). I know that ZMQ has a way of specifying buffer sizes, although I have no idea if they exist on PUB sockets. This could just be a Simple Matter Of Code.

This ticket may also be a duplicate of #52 if this is the actual cause. (It may not be).

Many thanks to @techman83 in helping find this.

Code which generates .exobrainrc file for the first time

This may be part of the installer, and we may completely move away from .ini files entirely, but otherwise it's pretty essential that that we have a generator so people can easily install exobrain.

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1388246-code-which-generates-exobrainrc-file-for-the-first-time?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

Reduce dependency requirements

Exobrain has an incredible number of dependencies. While they all install cleanly on a fresh ubuntu box when following the install instructions, that still takes a very long time.

We'd like to reduce these somewhat. Some dependencies aren't actually used (eg, the WIP xmpp server, which brings in all of AnyEvent), and others shouldn't be used unless the user actually wants to use that component. (Why install the Facebook deps if the user isn't using a Facebook source/sink?)

So we should:

  • Split Exobrain into components. Sinks, sources, and actions should be made into their own distributions, so users can only install what they need.
  • Find and remove code that's no longer used in Exobrain.

Part of splitting Exobrain into components can be converting existing executable files into classes (#26). They can still be managed via Ubic, but they're much cleaner to handle, can provide their own meta-data to Exobrain (if we want that), are easier to test, and don't clutter up the user's bin directory.

We may also consider using Carton, Shipwright, PAR, or some other packaging system to provide a single "exobrain in a box" download.


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Allow ZMQ end-points to be configurable

Right now ZMQ end-points are hard-coded, which means we can't really do any testing that involves pushing packets, nor can we run more than one instance of exobrain on a single machine.

This should be configurable.

Once we're pushing packets in tests, we can close #24 as well.


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Integrate selfspy (if possible)

https://github.com/gurgeh/selfspy

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1388241-integrate-selfspy-if-possible?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

Messages don't appear on the Bus

Decided to do a fresh install on a newer version of Ubuntu.

leon@gandalf:~$ cat /etc/issue.net 
Ubuntu 14.04 LTS

Pings get ack'd and DMs are sent to pushover. However running the following results in no notification and nothing appearing on 'exobrain debug'

#!/usr/bin/env perl
use Exobrain;
use Data::Dumper;

my $exobrain = Exobrain->new;

$exobrain->notify("Testing 1.2.3..!");

print Dumper($exobrain);

Output of Dump

$VAR1 = bless( {
                 'pub' => bless( {
                                   'exobrain' => $VAR1,
                                   'type' => 'PUB',
                                   'subscribe' => '',
                                   'context' => bless( {
                                                         '_sockets' => [
                                                                         bless( {
                                                                                  '_socket' => bless( {}, 'ZMQ::LibZMQ3::Socket' )
                                                                                }, 'ZMQ::Socket' )
                                                                       ],
                                                         '_cxt' => bless( {}, 'ZMQ::LibZMQ3::Context' )
                                                       }, 'ZMQ::Context' ),
                                   '_socket' => $VAR1->{'pub'}{'context'}{'_sockets'}[0],
                                   'router' => bless( {
                                                        'subscriber' => 'tcp://127.0.0.1:3546',
                                                        'publisher' => 'tcp://127.0.0.1:3547',
                                                        'server' => 0
                                                      }, 'Exobrain::Router' )
                                 }, 'Exobrain::Bus' ),
                 'config' => bless( {
                                      'General' => {},
                                      'Components' => {
                                                        'Twitter' => '1.04'
                                                      },
                                      'Pushover' => {
                                                      'api_token' => 'removed',
                                                      'user_token' => 'removed'
                                                    },
                                      'Twitter' => {
                                                     'access_token_secret' => 'removed',
                                                     'access_token' => 'removed',
                                                     'consumer_key' => 'removed',
                                                     'consumer_secret' => 'removed'
                                                   }
                                    }, 'Exobrain::Config' )
               }, 'Exobrain' );

All the services appear to be running

leon@gandalf:~$ ps waux|grep perl
leon      7625  0.0  0.4  28556  8448 ?        S    07:18   0:00 perl /home/leon/perl5/bin/ubic-periodic --rotate-logs --period=60 --stdout=/home/leon/ubic/log/watchdog.log --stderr=/home/leon/ubic/log/watchdog.err.log ubic-watchdog
leon      7710  0.0  1.1 462632 23396 ?        Sl   07:19   0:00 /usr/bin/perl -w /home/leon/perl5/bin/router
leon      7747  0.0  2.7 337880 56488 ?        Sl   07:20   0:01 /usr/bin/perl /home/leon/ubic/service/exobrain run Twitter::Response
leon      7751  0.0  4.7 341860 96444 ?        Sl   07:20   0:07 /usr/bin/perl /home/leon/ubic/service/exobrain run Twitter::Source
leon      7755  0.0  3.8 312372 79116 ?        Sl   07:20   0:01 /usr/bin/perl /home/leon/ubic/service/exobrain run Twitter::Sink
leon      7789  0.0  2.0 310016 42732 ?        Sl   07:20   0:00 /usr/bin/perl /home/leon/ubic/service/exobrain run Action::Ping
leon      7800  0.0  1.9 309880 40704 ?        Sl   07:20   0:00 /usr/bin/perl /home/leon/ubic/service/exobrain run Action::SocialNotify
leon      9316  0.0  1.9 242752 39076 pts/1    Sl+  08:06   0:00 /usr/bin/perl /home/leon/perl5/bin/exobrain debug -v
leon      9804  0.0  3.3 305072 69664 ?        Sl   08:19   0:01 /usr/bin/perl -w /home/leon/perl5/bin/pushover

Apart from a deprecation warning in Net::HTTP (which is already fixed, but not yet released) there is nothing in the logs. I am a little stumped!

Measurements/Intents without sending?

It makes sense to always send a measurement or intent, otherwise why would
we create it?

Well, for testing purposes; but the typical usage is to send them. So
perhaps we should add an autosend attribute which defaults to true
(and is checked for in BUILD), but which can be set to false in
testing scripts.

This would essentially obsolete the awful ->send_msg calls we see all over the place.

Move from scripts to classes

Right now all end-points and actions are in scripts. There are a lot of them. They're cluttered. They don't inherit from any base class, or consume any common role.

We should fix this, because it will reduce a lot of boilerplate, and will make it much easier to write extensions. At the very least, I expect we'll want roles (or maybe classes) for:

  • Exobrain::Source (produces Exobrain::Measurement:: packets)
  • Exobrain::Action (consumes measurements, produces intents)
  • Exobrain::Sink (consumes Exobrain::Intent:: packets)

Our scripts can then be moved to classes which consume these roles. AFAIK Ubic can start/stop classes just fine. :)

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1406284-move-from-scripts-to-classes?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

Migrate to ZMQ.pm

The ZMQ module for Perl supports both ZMQ2 and ZMQ3. While there's a little work that's needed to do version-sniffing for things like send() and recv(), most of it's generic. It should be pretty easy for what we're doing to use it.

  • Switch from ZMQ2 to ZMQ
  • Test under ZMQ2
  • Test under ZMQ3

Word on the street is the ZMQx::Class will probably end up being the way to go eventually, as it should support both ZMQ3 and the freshly released ZMQ4, but that can be done later.


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Guide for integrating with other languages

Essentially this is the message spec. We should have one.

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1388237-guide-for-integrating-with-other-languages?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

Add Mac installation instructions

Lots of people use Macs and homebrew, so we should have an install guide for them.

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1406171-add-mac-installation-instructions?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

Provide a way for agents to provide dependencies.

A number of our general-purpose "action" agents are going to have dependencies. For example, the agent for updating one's beeminder graph based upon inbox low-water-marks is going to depend at least upon the IMAP and Beeminder components.

Right now these agents will try to load missing components and fail to start, however it would be great for agents to declare their dependencies up-front. Then we could have a exobrain start ... wrapper which makes sure the required components are installed, and informs the user if they're not.

The advantage here is that the exobrain core distribution can include lots of useful agents without them being hard dependencies, and prompt the user to install components as they're required.


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Auto-configure ->is_me on 4SQ packets

Right now we read out the identity portion of our config. However the {user}{relationship} part of the received event is set to self when the check-in is our own. We should be able to auto-detect that.

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1412450-auto-configure-is_me-on-4sq-packets?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

Send multiple SMS messages if length > 160

Right now we require Intent::SMS messages to have 160 characters or less. Really, we should just allow them to be longer, and have the underlying end-point send multiple messages if required.

We can extend Intent::SMS with a truncate flag (defaulting to false) if we want to enforce truncation of messages.

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1412333-send-multiple-sms-messages-if-length-160?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

Add TODO items from sent email

In a nutshell, it'd be awesome to have exobrain scan my sent email and automatically generate TODO items.

Eg:

Hey client, I'm going to:

* Send (your company) a quote for (work). #todo
* Set up a new box for integration testing. #todo
* etc etc

Syntax to be properly decided. But I find myself sending clients a list of things I'll be doing for them, and then manually having to add those to my TODO manager.

  • Figure out syntax
  • Implement a sent message scanner that looks for said syntax
  • Add a complimentary classifier for said scanner that adds to RTM.

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1388242-add-todo-items-from-sent-email?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

Embed role information in packets

Right now all packets include their class, but not their roles. This is problematic for two reasons:

  • We can't test to see if a packet implements a role without loading its class. For something running watch_loop, that would end up loading all the classes, which is precisely what we're trying to avoid.
  • Anyone using a non-Perl component can't load the Perl classes anyway, so they're doubly screwed.

We should add role information to the meta-data section of packets, and allow watch_loop users to trigger on that. Therefore we can (for example) inspect all Measurement::Social providers, regardless of their original source.

Personal log classifying agent

I've realised most of the personal logging I want to do are things I'm pushing out to social media already. Consequently, I want a frictionless logging classifier. The rule is simple:

  • If I see a status (Measurement::Social) containing the #log tag, then add that to my personal log. (Possibly with a note indicating its source).

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1927389-personal-log-classifying-agent?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

exobrain command

Currently we get users to copy the exobrain file into their ubic/services directory. That's manual, and it sucks. The exobrain command is also a potential landing point for people on the CPAN, so it needs better docs (related to #28).

Ideally I'd like a cmdline interface to handle exobrain-related tasks. This means we can do things like:

$ exobrain install
$ exobrain config
$ exobrain restart

This means the exobrain command itself is less a Ubic config, and more an exobrain manager (which would probably wrap ubic). It would still write ubic configs, although probably in a less monolithic way than what we have now.

In an ideal world, the exobrain command would be used to enable/disable actions:

$ exobrain enable twitter-rtm

Combined with meta-data provided by #26 , this means the user just selects actions, and exobrain can toggle end-points (and prompt for configuration) as required.


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

exobrain setup twitter puts file in nonexistant directory

$ exobrain setup Twitter
Configuring Exobrain::Twitter...

Hey there, we'll need to start by getting an API key from twitter.

Head over to: https://apps.twitter.com/app/new

You need only fill in the required fields there.
Alternatively, if you already have a registered app, you can use that.

--> Your application MUST require read, write, and DM access <--

Once done, you'll need to provide the API key and secret.
These are not shared with anyone.

API key: zool
API secret: hunter2

Thanks! Authing with twitter...

Great! Now, to complete the auth, visit this URL, and enter the PIN...

https://api.twitter.com/oauth/authorize?oauth_token=things

PIN: 12345

Thanks @bkero!
Can't mkdir('/home/ubuntu/.config/exobrain'): No such file or directory at /home/ubuntu/perl5/lib/perl5/Exobrain/Config.pm line 64

$


Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

Support multiple accounts for each endpoint.

Eg, allow one to have multiple twitter accounts, IRC bots, etc.

This would probably require an expansion of the current configuration system (right now we use .ini files), probably to YAML or JSON configs (to represent the information for each account), and a tweak to our start code to allow all instances to be iterated over. Obviously packet information needs to indicate which account things correspond to.

This is separate from allowing multiple users, which would almost certainly involve separate config directories entirely, and a separate 0MQ bus for each user. (This would be needed for EaaS.)

Suggested by @_aGHz.

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1430272-support-multiple-accounts-for-each-endpoint?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

Ubic

Hi Paul,

I'm well aware that this might be perfectly obvious to some (including yourself) but it had taken me a while to figure out what Ubic actually was and where to get it, as there's no package in my distribution.

Would you mind including a link to its GitHub and/or CPAN repository in the README, please?

Exobrain needs a logo

Right now exobrain has no logo, which is terribly bothersome.

Ideally: square, and with a license compatible with CC-BY, GPL, and Artistic (Perl).

Bonus points for vector graphics so it's scalable. :)

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1406452-exobrain-needs-a-logo?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

lolcommits -> github

It would be hilarious to have lolcommits automatically replace one's github user logo.

--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/1388236-lolcommits-github?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F347315&utm_medium=issues&utm_source=github).

Add better way to listen for messages

We really need a generalised filter interface for searching for messages, so we can do something like:

# Watch for my own check-ins
$exobrain->add_rule( measure => 'GEO', is_self => 1);

# Also watch my github commits
$exobrain->add_rule( measure => 'GITHUB', is_self => 1);

It probably makes sense for these to take callbacks:

$exobrain->add_rule(
    measure => 'GEO',
    is_self => 1,
    callback => \&log_location
);

so we can fire up code to watch for particular types of events, and trigger callbacks when they're detected. This should simplify lots of code, especially in large classifiers which (for example) want to grab lots of data and smoosh them into a life-logger (like idonethis).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.