view release on metacpan or search on metacpan
lib/Alice.pm view on Meta::CPAN
my ($w, $t);
my $shutdown = sub {
undef $w;
undef $t;
$self->shutdown;
$cb->() if $cb;
};
$w = AE::idle sub {$shutdown->() unless $self->connected_ircs};
$t = AE::timer 3, 0, $shutdown;
}
sub shutdown {
my $self = shift;
$self->_ircs([]);
$_->close for @{$self->streams};
$self->streams([]);
}
lib/Alice.pm view on Meta::CPAN
if ($config->{ircname} ne $prev{$network}) {
$irc->update_realname($config->{ircname});
}
}
}
for my $irc ($self->ircs) {
my $name = $irc->name;
unless (exists $self->config->servers->{$name}) {
$self->send_info("config", "removing $name server");
if ($irc->is_disconnected) {
$self->cancel_reconnect($name) if $irc->reconnect_timer;
$irc->cl(undef);
$self->remove_irc($name);
}
else {
$irc->removed(1);
$self->disconnect_irc($name);
}
}
}
}
lib/Alice/HTTP/Server.pm view on Meta::CPAN
is => 'rw',
lazy => 1,
builder => "_build_httpd",
);
has ping => (
is => 'rw',
lazy => 1,
default => sub {
my $self = shift;
AE::timer 1, 5, sub {
$self->app->ping;
};
},
);
has port => (
is => 'ro',
default => 8080,
);
lib/Alice/HTTP/Stream/XHR.pm view on Meta::CPAN
isa => 'Bool',
default => 0,
);
has [qw/offset last_send start_time/]=> (
is => 'rw',
isa => 'Num',
default => 0,
);
has 'timer' => (
is => 'rw',
);
has 'writer' => (
is => 'rw',
required => 1,
);
has min_bytes => (
is => 'ro',
lib/Alice/HTTP/Stream/XHR.pm view on Meta::CPAN
my $self = shift;
return if $self->closed;
$self->send([{type => "action", event => "ping"}]);
}
sub close {
my $self = shift;
$self->flush;
$self->writer->close if $self->writer;
$self->writer(undef);
$self->timer(undef);
$self->closed(1);
}
sub flooded {
my $self = shift;
my $diff = time - $self->last_send;
if ($diff < 0.2) {
return 0.2 - $diff;
}
return 0;
}
sub delay {
my ($self, $delay) = @_;
$self->delayed(1);
$self->timer(AnyEvent->timer(
after => $delay,
cb => sub {
$self->delayed(0);
$self->timer(undef);
$self->send;
},
));
}
sub flush {
my $self = shift;
$self->clear_queue;
$self->last_send(time);
}
lib/Alice/IRC.pm view on Meta::CPAN
*AnyEvent::IRC::Client::mk_msg = \&mk_msg;
}
has 'cl' => (is => 'rw');
has 'name' => (
is => 'ro',
required => 1,
);
has 'reconnect_timer' => (
is => 'rw'
);
has [qw/is_connecting reconnect_count connect_time/] => (
is => 'rw',
default => 0,
);
sub increase_reconnect_count {$_[0]->reconnect_count($_[0]->reconnect_count + 1)}
sub reset_reconnect_count {$_[0]->reconnect_count(0)}
lib/Alice/MessageStore.pm view on Meta::CPAN
has trim => (
is => 'rw',
default => sub {{}},
);
has backlog => (
is => 'ro',
default => 5000,
);
has 'trim_timer' => (
is => 'ro',
default => sub {
my $self = shift;
AE::timer 60, 60, sub{$self->do_trim};
}
);
has dsn => (
is => 'ro',
required => 1,
);
has dbi => (
is => 'ro',
lib/Alice/Readme.pod view on Meta::CPAN
=item /connect <network>
Connect to a network. The network must be the name of a server from
the Connections window. If you are already connected to the network
it will do nothing.
=item /disconnect <network>
Disconnect from a network. The network must be the name of a server
from the Connections window. This command will also stop any reconnect
timers for that network.
=item /ignore <nick>
Ignore any nick that matches the one provided. B<This applies across
all networks.>
=item /ignores
List all active ignored nicks.
lib/Alice/Role/IRCEvents.pm view on Meta::CPAN
} @{$config->{on_connect}};
push @commands, map {
my $channel = $_;
sub {
$self->send_info($irc->name, "joining $channel");
$irc->send_srv("JOIN", split /\s+/, $channel);
}
} @{$config->{channels}};
my $t; $t = AE::timer 1, 0.5, sub {
if (my $command = shift @commands) {
$command->();
}
else {
undef $t;
}
};
my $name = $irc->name;
$irc->cl->enable_ping(300 => sub { $self->reconnect_irc($name) });
lib/Alice/Role/IRCEvents.pm view on Meta::CPAN
throw InvalidNetwork "$name isn't one of your networks" unless $irc;
my $interval = time - $irc->connect_time;
if ($interval < 15) {
$time = 15 - $interval;
$self->send_info($irc->name, "last attempt was within 15 seconds, delaying $time seconds")
}
if (!defined $time) {
# increase timer by 15 seconds each time, until it hits 5 minutes
$time = min 60 * 5, 15 * $irc->reconnect_count;
}
$self->send_info($irc->name, "reconnecting in $time seconds");
$irc->reconnect_timer(AE::timer $time, 0, sub {$self->connect_irc($name)});
}
sub disconnect_irc {
my ($self, $name, $msg) = @_;
my $irc = $self->get_irc($name);
throw InvalidNetwork "$name isn't one of your networks" unless $irc;
if ($irc->reconnect_timer) {
$self->cancel_reconnect($name);
return;
}
throw DisconnectError "$name is already disconnected" if $irc->is_disconnected;
$self->send_info($irc->name, "disconnecting: $msg") if $msg;
$irc->is_connecting(0);
$irc->disabled(1);
$msg ||= $self->config->quitmsg;
lib/Alice/Role/IRCEvents.pm view on Meta::CPAN
my $irc = $self->get_irc($name);
throw InvalidNetwork "$name isn't one of your networks" unless $irc;
$self->send_info($irc->name, "canceled reconnect");
$self->broadcast({
type => "action",
event => "disconnect",
network => $irc->name,
windows => [], #shouldn't be any windows if we're not connected.
});
$irc->reconnect_timer(undef);
$irc->reset_reconnect_count;
}
sub connect_irc {
my ($self, $name) = @_;
my $irc = $self->get_irc($name);
throw InvalidNetwork "$name isn't one of your networks" unless $irc;
throw ConnectError "$name is already connected" if $irc->is_connected;
throw ConnectError "$name is already connecting" if $irc->is_connecting;
$irc->reconnect_timer(undef);
my $config = $self->config->servers->{$irc->name};
# some people don't set these, wtf
if (!$config->{host} or !$config->{port}) {
$self->send_info($irc->name, "can't connect: missing either host or port");
return;
}
my $events = $self->build_events($irc);
$irc->new_client($events, $config);
share/static/alice.js view on Meta::CPAN
var PeriodicalExecuter = Class.create({
initialize: function(callback, frequency) {
this.callback = callback;
this.frequency = frequency;
this.currentlyExecuting = false;
this.registerCallback();
},
registerCallback: function() {
this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
},
execute: function() {
this.callback(this);
},
stop: function() {
if (!this.timer) return;
clearInterval(this.timer);
this.timer = null;
},
onTimerEvent: function() {
if (!this.currentlyExecuting) {
try {
this.currentlyExecuting = true;
this.execute();
this.currentlyExecuting = false;
} catch(e) {
this.currentlyExecuting = false;
share/static/alice.js view on Meta::CPAN
this.start();
},
start: function() {
this.options.onComplete = this.updateComplete.bind(this);
this.onTimerEvent();
},
stop: function() {
this.updater.options.onComplete = undefined;
clearTimeout(this.timer);
(this.onComplete || Prototype.emptyFunction).apply(this, arguments);
},
updateComplete: function(response) {
if (this.options.decay) {
this.decay = (response.responseText == this.lastText ?
this.decay * this.options.decay : 1);
this.lastText = response.responseText;
}
this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
},
onTimerEvent: function() {
this.updater = new Ajax.Updater(this.container, this.url, this.options);
}
});
function $(element) {
if (arguments.length > 1) {
share/static/alice.js view on Meta::CPAN
});
if (window.Event) Object.extend(window.Event, Event);
else window.Event = Event;
})();
(function() {
/* Support for the DOMContentLoaded event is based on work by Dan Webb,
Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */
var timer;
function fireContentLoadedEvent() {
if (document.loaded) return;
if (timer) window.clearTimeout(timer);
document.loaded = true;
document.fire('dom:loaded');
}
function checkReadyState() {
if (document.readyState === 'complete') {
document.stopObserving('readystatechange', checkReadyState);
fireContentLoadedEvent();
}
}
function pollDoScroll() {
try { document.documentElement.doScroll('left'); }
catch(e) {
timer = pollDoScroll.defer();
return;
}
fireContentLoadedEvent();
}
if (document.addEventListener) {
document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false);
} else {
document.observe('readystatechange', checkReadyState);
if (window == top)
timer = pollDoScroll.defer();
}
Event.observe(window, 'load', fireContentLoadedEvent);
})();
Element.addMethods();
/*------------------------------- DEPRECATED -------------------------------*/
Hash.toQueryString = Object.toQueryString;
share/static/alice.js view on Meta::CPAN
var end = function(){
alice.freeze();
alice.tabs_width = $('tabs_container').getWidth();
alice.updateOverflowMenus();
active.scrollToPosition(position);
active.shiftTab();
window.onresize = resize;
};
var end_timer;
window.onresize = function() {
clearTimeout(end_timer);
end_timer = setTimeout(end, 1000);
};
};
window.onresize = resize;
var move = function(e) {
var width = document.viewport.getWidth();
var left = windows.hasClassName('nicklist') ? 200 : 100;
var visible = toggle.hasClassName('visible');
if (!visible && width - e.pointerX() > left)
return;
toggle.addClassName('visible');
var end = function() {
toggle.removeClassName('visible');
window.onmousemove = move;
};
var end_timer;
window.onmousemove = function() {
clearTimeout(end_timer);
end_timer = setTimeout(end, 1000);
};
};
window.onmousemove = move;
window.onfocus = function () {
alice.input.focus();
alice.freeze();
alice.tabs_width = $('tabs_container').getWidth();
share/templates/config.html view on Meta::CPAN
? my $network = $irc->name;
? my $config = $app->config->servers->{$network};
? my ($action, $status);
? if ($irc->is_connected) {
? $status = "connected";
? $action = "disconnect";
? } elsif ($irc->is_connecting) {
? $status = "connecting";
? $action = "disconnect";
? } elsif ($irc->reconnect_timer) {
? $status = "reconnecting";
? $action = "disconnect";
? } else {
? $status = "disconnected";
? $action = "connect";
? }
<table class="<? if ($index == 0) {?>active<?}?>" id="setting_<?= $network ?>">
<tr>