aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--META.info14
-rw-r--r--README.md163
-rw-r--r--README.pod37
-rw-r--r--examples/bot.pl64
-rw-r--r--get-TZs.pl54
-rw-r--r--lib/IRC/Client.pm616
-rw-r--r--lib/IRC/Client/Plugin.pm68
-rw-r--r--lib/IRC/Client/Plugin/Debugger.pm69
-rw-r--r--lib/IRC/Client/Plugin/HNY.pm626
-rw-r--r--lib/IRC/Client/Plugin/PingPong.pm610
-rw-r--r--lib/IRC/Grammar/Actions.pm69
-rw-r--r--t/00-use.t13
-rw-r--r--test.p622
-rw-r--r--tzs.json1
14 files changed, 214 insertions, 172 deletions
diff --git a/META.info b/META.info
index c474363..39e6093 100644
--- a/META.info
+++ b/META.info
@@ -1,14 +1,18 @@
{
+ "perl" : "6.*",
"name" : "IRC::Client",
"version" : "1.001001",
- "description"
- : "Extendable Internet Relay Chat client",
- "depends" : [ ],
+ "description" : "Extendable Internet Relay Chat client",
+ "depends" : [ "Data::Dump" ],
"test-depends" : [ "Test" ],
"provides" : {
- "IRC::Client" : "lib/IRC/Client.pm6"
+ "IRC::Client" : "lib/IRC/Client.pm6",
+ "IRC::Grammar" : "lib/IRC/Grammar.pm6",
+ "IRC::Parser" : "lib/IRC/Parser.pm6",
+ "IRC::Grammar::Actions" : "lib/IRC/Grammar/Actions.pm6",
+ "IRC::Client::Plugin::Debugger" : "lib/IRC/Client/Plugin/Debugger.pm6",
+ "IRC::Client::Plugin::PingPong" : "lib/IRC/Client/Plugin/PingPong.pm6"
},
"author" : "Zoffix Znet",
- "authority" : "zoffixznet",
"source-url" : "git://github.com/zoffixznet/perl6-IRC-Client.git"
}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..298b2f3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,163 @@
+[![Build Status](https://travis-ci.org/zoffixznet/perl6-IRC-Client.svg)](https://travis-ci.org/zoffixznet/perl6-IRC-Client)
+
+# NAME
+
+IRC::Client - Extendable Internet Relay Chat client
+
+# SYNOPSIS
+
+```perl6
+ use IRC::Client;
+ use IRC::Client::Plugin::Debugger;
+
+ IRC::Client.new(
+ :host('localhost'),
+ :debug,
+ plugins => [ IRC::Client::Plugin::Debugger.new ]
+ ).run;
+```
+
+# DESCRIPTION
+
+***Note: this is a preview dev release. Things might change and new things
+might get added rapidly. The first stable version is currently planned
+to appear by January 3, 2016***
+
+This modules lets you create
+[IRC clients](https://en.wikipedia.org/wiki/Internet_Relay_Chat)
+in Perl 6. The plugin system lets you work on the behaviour, without worrying
+about IRC layer.
+
+# METHODS
+
+## `new`
+
+```perl6
+my $irc = IRC::Client.new;
+```
+
+```perl6
+# Defaults are shown
+my $irc = IRC::Client.new(
+ debug => False,
+ host => 'localhost',
+ port => 6667,
+ nick => 'Perl6IRC',
+ username => 'Perl6IRC',
+ userhost => 'localhost',
+ userreal => 'Perl6 IRC Client',
+ channels => ['#perl6bot'],
+ plugins => [],
+ plugins-essential => [ IRC::Client::Plugin::PingPong.new ],
+);
+```
+
+Creates and returns a new `IRC::Client` objects. All arguments are optional
+and are as follows:
+
+### `debug`
+
+```perl6
+ debug => True,
+```
+Takes `True` and `False` values. When set to `True`, debugging information
+will be printed by the modules on the STDOUT. **Defaults to:** `False`
+
+### `host`
+
+```perl6
+ host => 'irc.freenode.net',
+```
+Specifies the hostname of the IRC server to connect to. **Defaults to:**
+`localhost`
+
+### `port`
+
+```perl6
+ port => 7000,
+```
+Specifies the port of the IRC server to connect to. **Defaults to:** `6667`
+
+### `nick`
+
+```perl6
+ nick => 'Perl6IRC',
+```
+Specifies the nick for the client to use. **Defaults to:** `Perl6IRC`
+
+### `username`
+
+```perl6
+ username => 'Perl6IRC',
+```
+Specifies the username for the client to user. **Defaults to:** `Perl6IRC`
+
+### `userhost`
+
+```perl6
+ userhost => 'localhost',
+```
+Specifies the hostname for the client to use when sending messages.
+**Defaults to:** `localhost` (Note: it's probably safe to leave this at
+default. Currently, this attribute is fluid and might be changed or
+removed in the future).
+
+### `userreal`
+
+```perl6
+ userreal => 'Perl6 IRC Client',
+```
+Specifies the "real name" of the client. **Defaults to:** `Perl6 IRC Client`
+
+### `channels`
+
+```perl6
+ channels => ['#perl6bot'],
+```
+Takes an array of channels for the client to join. **Defaults to:**
+`['#perl6bot']`
+
+### `plugins`
+
+```perl6
+ plugins => [ IRC::Client::Plugin::Debug.new ],
+```
+Takes an array of IRC::Client Plugin objects. To run while the client is
+connected.
+
+### `plugins-essential`
+
+```perl6
+ plugins-essential => [ IRC::Client::Plugin::PingPong.new ],
+```
+Same as `plugins`. The only difference is something will be set to
+these by default, as these plugins are assumed to be essential to proper
+working order of any IRC client. **Defaults to:**
+`[ IRC::Client::Plugin::PingPong.new ]`
+
+## `run`
+
+ $irc.run;
+
+Takes no arguments. Starts the IRC client. Exits when the connection
+to the IRC server ends.
+
+# REPOSITORY
+
+Fork this module on GitHub:
+https://github.com/zoffixznet/perl6-IRC-Client
+
+# BUGS
+
+To report bugs or request features, please use
+https://github.com/zoffixznet/perl6-IRC-Client/issues
+
+# AUTHOR
+
+http://zoffix.com/
+
+# LICENSE
+
+You can use and distribute this module under the terms of the
+The Artistic License 2.0. See the C<LICENSE> file included in this
+distribution for complete details.
diff --git a/README.pod b/README.pod
deleted file mode 100644
index 70b4f78..0000000
--- a/README.pod
+++ /dev/null
@@ -1,37 +0,0 @@
-=encoding utf8
-
-=for HTML <a href="https://travis-ci.org/zoffixznet/perl6-IRC-Client"><img src="https://travis-ci.org/zoffixznet/perl6-IRC-Client.svg?branch=master"></a>
-
-=head1 NAME
-
-IRC::Client - Extendable Internet Relay Chat client
-
-=head1 SYNOPSIS
-
- # None yet
-
-=head1 DESCRIPTION
-
-None yet
-
-=head1 REPOSITORY
-
-Fork this module on GitHub:
-L<https://github.com/zoffixznet/perl6-IRC-Client>
-
-=head1 BUGS
-
-To report bugs or request features, please use
-L<https://github.com/zoffixznet/perl6-IRC-Client/issues>
-
-=head1 AUTHOR
-
-Zoffix Znet L<http://zoffix.com/>
-
-=head1 LICENSE
-
-You can use and distribute this module under the same terms as Perl 6
-itself. See the C<LICENSE> file included in this distribution for complete
-details.
-
-=cut
diff --git a/examples/bot.pl6 b/examples/bot.pl6
index b410288..20bcb39 100644
--- a/examples/bot.pl6
+++ b/examples/bot.pl6
@@ -2,13 +2,11 @@ use v6;
use lib 'lib';
use IRC::Client;
use IRC::Client::Plugin::Debugger;
-# use IRC::Client::Plugin::HNY;
my $irc = IRC::Client.new(
- :host('10.10.11.12'),
+ :host('localhost'),
:debug,
plugins => [
IRC::Client::Plugin::Debugger.new
- # IRC::Client::Plugin::HNY.new,
]
).run;
diff --git a/get-TZs.pl b/get-TZs.pl
deleted file mode 100644
index 35361cf..0000000
--- a/get-TZs.pl
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env perl
-
-use strict;
-use warnings;
-use Mojo::DOM;
-use Mojo::Util qw/spurt/;
-use Mojo::JSON qw/encode_json/;
-use Mojo::UserAgent;
-use 5.020;
-use experimental 'postderef';
-
-my $dom = Mojo::UserAgent->new->get('http://time.is/time_zones')->res->dom;
-
-my @tzs;
-for my $d ( $dom->find('.section')->each ) {
- my $tz = { offset => $d->at('h1')->all_text };
- my @countries = Mojo::DOM->new($d)
- ->wrap('<zof></zof>')->find('zof > * > div > ul > li ')->each;
- for my $cont_d ( @countries ) {
- my $name = $cont_d->children('a')->first->all_text;
- my @cities = $cont_d->find('li a')->map('all_text')->to_array->@*;
- push $tz->{countries}->@*, +{
- name => $name,
- cities => \@cities,
- };
- }
-
- push @tzs, $tz;
-}
-
-spurt encode_json(\@tzs) => 'tzs.json';
-
-__END__
-
-<div class="section even">
- <h1>UTC-9</h1>
- <div class="cloud scloud w90">
- <ul>
- <li id="c10">
- <a class="s1 country multizone bold" href="French_Polynesia">French Polynesia</a>
- <ul>
- <li><a class="s4" href="Rikitea">Rikitea</a></li>
- </ul>
- </li>
- <li id="c9">
- < class="s2 country multizone bold" href="United_States">United States</a>
- <ul>
- <li><a class="s3 multizone" href="Alaska">Alaska</a></li>
- <li><a class="s5" href="Anchorage">Anchorage</a></li>
- </ul>
- </li>
- </ul>
- </div>
-</div> \ No newline at end of file
diff --git a/lib/IRC/Client.pm6 b/lib/IRC/Client.pm6
index dcf0fcb..a27c18d 100644
--- a/lib/IRC/Client.pm6
+++ b/lib/IRC/Client.pm6
@@ -1,5 +1,6 @@
use v6;
use IRC::Parser; # parse-irc
+use IRC::Client::Plugin::PingPong;
role IRC::Client::Plugin { ... }
class IRC::Client:ver<1.001001> {
has Bool:D $.debug = False;
@@ -11,8 +12,10 @@ class IRC::Client:ver<1.001001> {
has Str:D $.userreal = 'Perl6 IRC Client';
has Str:D @.channels = ['#perl6bot'];
has IO::Socket::Async $.sock;
- has IRC::Client::Plugin @.plugins = [];
- has IRC::Client::Plugin @.plugins-essential = [];
+ has @.plugins = [];
+ has @.plugins-essential = [
+ IRC::Client::Plugin::PingPong.new
+ ];
method run {
await IO::Socket::Async.connect( $!host, $!port ).then({
@@ -27,10 +30,11 @@ class IRC::Client:ver<1.001001> {
react {
whenever $!sock.Supply -> $str is copy {
$!debug and $str.say;
- # say parse-irc($str).WHAT;
- my $x = parse-irc $str;
- @!plugins[0].msg(self, $x);
- .msg(self, $x) for @!plugins.grep(*.msg);
+ my $messages = parse-irc $str;
+ for @$messages -> $message {
+ .msg(self, $message)
+ for (@!plugins-essential, @!plugins).flat.grep(*.msg);
+ }
}
}
diff --git a/lib/IRC/Client/Plugin.pm6 b/lib/IRC/Client/Plugin.pm6
deleted file mode 100644
index 724447e..0000000
--- a/lib/IRC/Client/Plugin.pm6
+++ /dev/null
@@ -1,8 +0,0 @@
-use v6;
-use IRC::Client;
-unit role IRC::Client::Plugin:ver<1.001001>;
-
-multi method inverval ( ) { 0 }
-multi method inverval (IRC::Client) { ... }
-multi method msg ( ) { False }
-multi method msg (IRC::Client) { ... }
diff --git a/lib/IRC/Client/Plugin/Debugger.pm6 b/lib/IRC/Client/Plugin/Debugger.pm6
index 20a2283..dabb353 100644
--- a/lib/IRC/Client/Plugin/Debugger.pm6
+++ b/lib/IRC/Client/Plugin/Debugger.pm6
@@ -1,15 +1,14 @@
use v6;
-use IRC::Client;
-use IRC::Client::Plugin;
-unit class IRC::Client::Plugin::Debugger:ver<1.001001> does IRC::Client::Plugin;
+use Data::Dump;
+unit class IRC::Client::Plugin::Debugger:ver<1.001001>;
multi method msg () { True }
multi method msg ($irc, $msg) {
- $msg.say;
+ say Dump $msg, :indent(4);
}
multi method interval ( ) { 6 }
-multi method interval (IRC::Client $irc) {
+multi method interval ($irc) {
$irc.privmsg(
$irc.channels[0], "5 seconds passed. Time is now " ~ now
);
diff --git a/lib/IRC/Client/Plugin/HNY.pm6 b/lib/IRC/Client/Plugin/HNY.pm6
deleted file mode 100644
index ce7154d..0000000
--- a/lib/IRC/Client/Plugin/HNY.pm6
+++ /dev/null
@@ -1,26 +0,0 @@
-use v6;
-use JSON::Tiny;
-use IRC::Client;
-use IRC::Client::Plugin;
-
-unit class IRC::Client::Plugin::HNY:ver<1.001001> does IRC::Client::Plugin;
-
-
-get_UTC_offsets();
-
-multi method interval ( ) { 6 }
-multi method interval (IRC::Client $irc) {
- $irc.privmsg(
- $irc.channels[0], "5 seconds passed. Time is now " ~ now
- );
-}
-
-
-
-sub get_UTC_offsets {
- my $times = from-json 'tzs.json'.IO.slurp;
-
- for $times -> $zone {
- say "Offset is $zone<offset>";
- }
-}
diff --git a/lib/IRC/Client/Plugin/PingPong.pm6 b/lib/IRC/Client/Plugin/PingPong.pm6
new file mode 100644
index 0000000..7ba977d
--- /dev/null
+++ b/lib/IRC/Client/Plugin/PingPong.pm6
@@ -0,0 +1,10 @@
+use v6;
+unit class IRC::Client::Plugin::PingPong:ver<1.001001>;
+
+multi method msg () { True }
+multi method msg ($irc, $msg) {
+ return unless $msg<command> eq 'PING';
+ my $res = "PONG {$irc.nick} $msg<params>[0]";
+ $irc.debug and say $res;
+ $irc.ssay($res);
+}
diff --git a/lib/IRC/Grammar/Actions.pm6 b/lib/IRC/Grammar/Actions.pm6
index 7093b99..74a8f11 100644
--- a/lib/IRC/Grammar/Actions.pm6
+++ b/lib/IRC/Grammar/Actions.pm6
@@ -3,12 +3,11 @@ method TOP ($/) { $/.make: $<message>>>.made }
method message ($/) {
my $pref = $/<prefix>;
my %args = command => ~$/<command>;
- if ( $pref<servername>.defined ) {
- %args<who><host> = ~$pref<servername>;
- }
- else {
- %args<who><nick user host> = $pref<nick user host>».Str;
+ for qw/nick user host/ {
+ $pref{$_}.defined or next;
+ %args<who>{$_} = $pref{$_}.Str;
}
+ %args<who><host> = ~$pref<servername> if $pref<servername>.defined;
my $p = $/<params>;
loop {
diff --git a/t/00-use.t b/t/00-use.t
new file mode 100644
index 0000000..a46bca0
--- /dev/null
+++ b/t/00-use.t
@@ -0,0 +1,13 @@
+#!perl6
+
+use lib 'lib';
+use Test;
+
+use-ok 'IRC::Client';
+use-ok 'IRC::Grammar';
+use-ok 'IRC::Grammar::Actions';
+use-ok 'IRC::Parser';
+use-ok 'IRC::Client::Plugin::Debugger';
+use-ok 'IRC::Client::Plugin::PingPong';
+
+done-testing;
diff --git a/test.p6 b/test.p6
deleted file mode 100644
index aa9e493..0000000
--- a/test.p6
+++ /dev/null
@@ -1,22 +0,0 @@
-use v6;
-grammar IRC::Grammar:ver<1.001001> {
-
-my $res = IRC::Grammar.parse(
-":ZoffixW!~ZoffixW\@unaffiliated/zoffix PRIVMSG #perl6bot :test\r\n"
-, :actions(IRC::Grammar::Actions) ).made;
-
-say $res[0]
-
-=finish
-
-my @messages = (
- ":verne.freenode.net 372 Perl6IRC :- running for their sustained support.\r\n",
- ":Perl6IRC MODE Perl6IRC :+i\r\n",
- ":Perl6IRC!~Perl6IRC@static-67-226-172-41.ptr.terago.net JOIN #perl6bot\r\n",
- ":verne.freenode.net MODE #perl6bot +ns\r\n",
- ":verne.freenode.net 353 Perl6IRC @ #perl6bot :@Perl6IRC\r\n",
- ":ZoffixW!~ZoffixW@unaffiliated/zoffix JOIN #perl6bot\r\n",
- ":ZoffixW!~ZoffixW@unaffiliated/zoffix PRIVMSG #perl6bot :test\r\n",
-);
-# say so IRC::Grammar.parse(@messages[$_]) for 0..@messages.elems-1;
-# say IRC::Grammar.parse(":verne.freenode.net 372 Perl6IRC :- running for their sustained support.\r\n");
diff --git a/tzs.json b/tzs.json
deleted file mode 100644
index 3a9b748..0000000
--- a/tzs.json
+++ /dev/null
@@ -1 +0,0 @@
-[{"offset":"UTC-12","countries":[{"cities":["Baker Island","Howland Island"],"name":"Illes Perifèriques Menors dels EUA"}]},{"countries":[{"name":"Illes Perifèriques Menors dels EUA","cities":["Itascatown pre-WW2"]},{"cities":["Alofi"],"name":"Niue"},{"cities":["Pago Pago"],"name":"Samoa Americana"}],"offset":"UTC-11"},{"countries":[{"name":"Estats Units","cities":["Hawaii","Honolulu"]},{"cities":["Avarua"],"name":"Illes Cook"},{"name":"Illes Perifèriques Menors dels EUA","cities":["Millersville - pre-WW2 settlement"]},{"cities":["Papeete"],"name":"Polinèsia Francesa"}],"offset":"UTC-10"},{"countries":[{"cities":["Atuona"],"name":"Polinèsia Francesa"}],"offset":"UTC-9:30"},{"countries":[{"cities":["Alaska","Anchorage"],"name":"Estats Units"},{"cities":["Rikitea"],"name":"Polinèsia Francesa"}],"offset":"UTC-9"},{"countries":[{"name":"Canadà","cities":["Colúmbia Britànica","Surrey","Vancouver","Yukón"]},{"name":"Estats Units","cities":["Califòrnia","Los Angeles","Nevada","Oregon","San Diego","San Francisco","San José","Seattle","Washington"]},{"cities":["Mexicali","Tijuana"],"name":"Mèxic"},{"name":"Pitcairn","cities":["Adamstown"]}],"offset":"UTC-8"},{"offset":"UTC-7","countries":[{"name":"Canadà","cities":["Alberta","Calgary","Edmonton","Northwest Territories","Nunavut"]},{"name":"Estats Units","cities":["Albuquerque","Arizona","Colorado","Denver","El Paso","Idaho","Montana","Nou Mèxic","Phoenix","Utah","Wyoming"]},{"cities":["Chihuahua","Ciudad Juárez"],"name":"Mèxic"}]},{"offset":"UTC-6","countries":[{"cities":["Belmopan"],"name":"Belize"},{"name":"Canadà","cities":["Manitoba","Regina","Saskatchewan","Saskatoon","Winnipeg"]},{"cities":["Província de Limón","San José"],"name":"Costa Rica"},{"cities":["San Salvador","Santa Ana"],"name":"El Salvador"},{"cities":["Puerto Ayora"],"name":"Equador"},{"name":"Estats Units","cities":["Alabama","Arkansas","Austin","Chicago","Dakota del Nord","Dakota del Sud","Dallas","Fort Worth","Houston","Illinois","Iowa","Kansas","Kansas City","Louisiana","Menfis","Milwaukee","Minneapolis","Minnesota","Mississipí","Misuri","Nashville","Nebraska","Oklahoma","Oklahoma City","Omaha","San Antonio","Tennessee","Texas","Tulsa","Wisconsin"]},{"name":"Guatemala","cities":["Ciutat de Guatemala"]},{"name":"Hondures","cities":["San Pedro Sula","Tegucigalpa"]},{"cities":["Ciudad de México","Ecatepec","Guadalajara","León","Monterrey","Neza","Puebla de Zaragoza"],"name":"Mèxic"},{"cities":["León","Managua"],"name":"Nicaragua"}]},{"countries":[{"cities":["Nassau"],"name":"Bahames"},{"cities":["Acre","Rio Branco"],"name":"Brasil"},{"name":"Canadà","cities":["Mont-real","Ontàrio","Ottawa","Quebec","Toronto"]},{"cities":["Barranquilla","Bogotà","Cali","Cartagena de Indias","Medellín"],"name":"Colòmbia"},{"cities":["Guayaquil","Quito"],"name":"Equador"},{"name":"Estats Units","cities":["Atlanta","Baltimore","Boston","Carolina del Nord","Carolina del Sud","Charlotte","Cincinnati","Cleveland","Columbus","Connecticut","Delaware","Detroit","Florida","Georgia","Indiana","Indianàpolis","Jacksonville","Kentucky","Lexington-Fayette","Maine","Maryland","Massachusetts","Miami","Michigan","Nou Hampshire","Nova Jersey","Nova York","Ohio","Pennsilvània","Philadelphia","Pittsburgh","Raleigh","Rhode Island","Staten Island","Tampa","Vermont","Virginia Beach","Virgínia","Virgínia de lOest","Washington, D.C."]},{"cities":["Port-au-Prince"],"name":"Haití"},{"name":"Illes Caiman","cities":["George Town"]},{"cities":["Kingston","Spanish Town"],"name":"Jamaica"},{"name":"Mèxic","cities":["Cancun"]},{"name":"Panamà","cities":["Ciutat de Panamà"]},{"name":"Perú","cities":["Arequipa","Lima","Trujillo"]},{"name":"Xile","cities":[]}],"offset":"UTC-5"},{"countries":[{"cities":["Caracas","Maracaibo","Maracay"],"name":"Veneçuela"}],"offset":"UTC-4:30"},{"countries":[{"cities":["El Valle"],"name":"Anguilla"},{"cities":["Saint John's"],"name":"Antigua i Barbuda"},{"name":"Aruba","cities":["Oranjestad"]},{"cities":["Bridgetown"],"name":"Barbados"},{"cities":["La Paz","Santa Cruz de la Sierra"],"name":"Bolívia"},{"name":"Brasil","cities":["Amazonas","Campo Grande","Manaos","Mato Grosso","Mato Grosso del Sur","Pará","Rondonia","Roraima"]},{"name":"Canadà","cities":[]},{"name":"Cuba","cities":["LHavana","Santiago de Cuba"]},{"cities":["Willemstad"],"name":"Curazao"},{"name":"Dominica","cities":["Roseau"]},{"cities":["Saint George's"],"name":"Grenada"},{"name":"Guadeloupe","cities":["Basse-Terre"]},{"cities":["Georgetown"],"name":"Guyana"},{"name":"Illes Verges Britàniques","cities":["Road Town"]},{"name":"Illes Verges nord-americanes","cities":["Charlotte Amalie"]},{"cities":["Fort-de-France"],"name":"Martinica"},{"name":"Montserrat","cities":["Plymouth"]},{"name":"Municipio Especial de Bonaire","cities":["Kralendijk"]},{"name":"Puerto Rico","cities":["Carolina","San Juan"]},{"name":"República Dominicana","cities":["Santiago de los Caballeros","Santo Domingo"]},{"cities":["Gustavia"],"name":"Saint Barthélemy"},{"cities":["Basseterre"],"name":"Saint Kitts i Nevis"},{"cities":["Castries"],"name":"Saint Lucia"},{"cities":["Marigot"],"name":"Saint Martin"},{"cities":["Kingstown"],"name":"Saint Vincent i les Grenadines"},{"name":"Trinitat i Tobago","cities":["Chaguanas","Port-of-Spain"]},{"name":"Turks i Caicos","cities":["Cockburn Town"]}],"offset":"UTC-4"},{"offset":"UTC-3","countries":[{"name":"Argentina","cities":["Buenos Aires","Córdoba","Rosario"]},{"cities":["Hamilton"],"name":"Bermudes"},{"cities":["Alagoas","Amapá","Bahía","Belo Horizonte","Belém","Brasília","Ceará","Curitiba","Districte Federal","Espírito Santo","Fortaleza","Goiás","Maranhão","Minas Gerais","Paraná","Paraíba","Pernambuco","Piauí","Porto Alegre","Recife","Rio de Janeiro","Río Grande del Norte","Río Grande del Sur","Salvador","Santa Catarina","Sergipe","São Paulo","Tocantins"],"name":"Brasil"},{"name":"Canadà","cities":["Halifax","Illa del Príncep Eduard","Nova Brunsvic","Nova Escòcia","Saint John"]},{"cities":["Nuuk"],"name":"Grenlàndia"},{"name":"Guaiana Francesa","cities":["Caiena"]},{"name":"Illes Malvines","cities":["Puerto Stanley"]},{"name":"Paraguai","cities":["Asunción","Ciudad del Este"]},{"name":"Surinam","cities":["Paramaribo"]},{"cities":["Montevideo","Salto"],"name":"Uruguai"},{"cities":["Puente Alto","Santiago"],"name":"Xile"}]},{"countries":[{"name":"Canadà","cities":["New Foundland - Labrador","Saint John's"]}],"offset":"UTC-2:30"},{"offset":"UTC-2","countries":[{"name":"Brasil","cities":[]},{"name":"Illes Geòrgia del Sud i Sandwich del Sud","cities":[]},{"cities":["Saint-Pierre"],"name":"Saint Pierre i Miquelon"}]},{"countries":[{"name":"Azores","cities":["Ponta Delgada"]},{"cities":["Praia"],"name":"Cap Verd"},{"cities":["Ittoqqortoormiit"],"name":"Grenlàndia"}],"offset":"UTC-1"},{"offset":"UTC+0","countries":[{"cities":["Bobo-Dioulasso","Uagadugu"],"name":"Burkina Faso"},{"cities":["Abidjan","Bouaké","Yamoussoukro"],"name":"Costa d'Ivori"},{"name":"Ghana","cities":["Accra","Kumasi"]},{"cities":[],"name":"Grenlàndia"},{"cities":[],"name":"Guernsey"},{"name":"Guinea","cities":[]},{"cities":["Bafatá","Bissau","Conakry","Nzérékoré"],"name":"Guinea Bissau"},{"cities":["Banjul"],"name":"Gàmbia"},{"name":"Illes Canàries","cities":["Les Palmes de Gran Canària"]},{"name":"Illes Fèroe","cities":["Tórshavn"]},{"cities":["Cork","Dublín"],"name":"Irlanda"},{"cities":["Reykjavík"],"name":"Islàndia"},{"name":"Jersey","cities":[]},{"cities":["Monròvia"],"name":"Libèria"},{"cities":["Bamako","Sikasso"],"name":"Mali"},{"cities":[],"name":"Man"},{"name":"Marroc","cities":["Casablanca","Rabat"]},{"cities":["Nouakchott","Nuadibú"],"name":"Mauritània"},{"name":"Portugal","cities":["Lisboa","Porto"]},{"cities":["Birmingham","Bristol","Edimburg","Glasgow","Leeds","Leicester","Liverpool","Londres","Mánchester","Sheffield"],"name":"Regne Unit"},{"name":"Senegal","cities":["Dakar","Touba"]},{"name":"Sierra Leone","cities":["Bo","Freetown"]},{"name":"Sàhara Occidental","cities":[]},{"cities":[],"name":"São Tomé i Príncipe"},{"name":"Togo","cities":["Lomé","Sokodé"]}]},{"offset":"UTC+1","countries":[{"cities":["Durrës","Tirana"],"name":"Albània"},{"cities":["Berlín","Colònia","Essen","Frankfurt del Main","Hamburg","Munic","Stuttgart"],"name":"Alemanya"},{"cities":["Alger","Boumerdas","Orà"],"name":"Algèria"},{"cities":[],"name":"Andorra"},{"cities":["Luanda","N'dalatando"],"name":"Angola"},{"name":"Benin","cities":["Abomey-Calavi","Porto Novo"]},{"name":"Bèlgica","cities":["Anvers","Brusel·les"]},{"name":"Bòsnia i Hercegovina","cities":["Sarajevo"]},{"name":"Camerun","cities":["Duala","Yaoundé"]},{"name":"Congo - Brazzaville","cities":["Brazzaville","Pointe-Noire"]},{"name":"Congo - Kinshasa","cities":["Kikwit","Kinsasa"]},{"name":"Croàcia","cities":["Zagreb"]},{"cities":["Copenhaguen","Århus"],"name":"Dinamarca"},{"cities":["Bratislava","Košice"],"name":"Eslovàquia"},{"cities":["Ljubljana","Maribor"],"name":"Eslovènia"},{"name":"Espanya","cities":["Barcelona","Madrid","Sevilla","València","Zaragoza"]},{"cities":["Lió","Marsella","Niça","París","Tolosa de Llenguadoc"],"name":"França"},{"cities":["Libreville","Port-Gentil"],"name":"Gabon"},{"name":"Gibraltar","cities":[]},{"cities":["Bata","Malabo"],"name":"Guinea Equatorial"},{"name":"Hongria","cities":["Budapest","Debrecen"]},{"name":"Italia","cities":["Milà","Nàpols","Palerm","Roma","Torí"]},{"cities":[],"name":"Liechtenstein"},{"cities":[],"name":"Luxemburg"},{"cities":["Bitola","Skopje"],"name":"Macedònia"},{"cities":["La Valletta"],"name":"Malta"},{"name":"Montenegro","cities":["Podgorica"]},{"name":"Mònaco","cities":[]},{"name":"Nigèria","cities":["Aba","Abuja","Benin City","Ibadán","Kaduna","Kano","Lagos","Maiduguri","Port Harcourt","Zaria"]},{"cities":["Bergen","Oslo"],"name":"Noruega"},{"name":"Níger","cities":["Niamey"]},{"cities":["Amsterdam","La Haia"],"name":"Països Baixos"},{"name":"Polònia","cities":["Cracòvia","Varsòvia","Łódź"]},{"name":"República Centrafricana","cities":["Bangui","Bimbo"]},{"cities":[],"name":"San Marino"},{"name":"Suècia","cities":["Estocolm","Göteborg"]},{"name":"Suïssa","cities":["Berna","Zuric"]},{"cities":["Belgrad","Niš"],"name":"Sèrbia"},{"cities":["Tunis"],"name":"Tunísia"},{"cities":["Moundou","Yamena"],"name":"Txad"},{"cities":["Brno","Praga"],"name":"Txèquia"},{"name":"el Vaticà","cities":[]},{"name":"Àustria","cities":["Graz","Viena"]}]},{"offset":"UTC+2","countries":[{"cities":["Francistown","Gaborone"],"name":"Botswana"},{"name":"Bulgària","cities":["Plóvdiv","Sòfia"]},{"name":"Burundi","cities":["Buyumbura","Muyinga"]},{"cities":["Kisangani","Lubumbashi","Mbuji-Mayi"],"name":"Congo - Kinshasa"},{"cities":["Alexandria","El Caire","Puerto Saíd"],"name":"Egipte"},{"cities":["Tallinn","Tartu"],"name":"Estònia"},{"cities":["Espoo","Hèlsinki"],"name":"Finlàndia"},{"name":"Grècia","cities":["Atenes","Tessalònica"]},{"cities":["Mariehamn"],"name":"Illes Åland"},{"name":"Israel","cities":["Haifa","Jerusalem"]},{"name":"Jordània","cities":["Amman","Zarqa"]},{"name":"Lesotho","cities":["Mafeteng","Maseru"]},{"cities":["Daugavpils","Riga"],"name":"Letònia"},{"cities":["Kaunas","Vílnius"],"name":"Lituània"},{"cities":["Beirut","Trípoli"],"name":"Líban"},{"cities":["Trípoli"],"name":"Líbia"},{"name":"Malawi","cities":["Blantyre","Lilongwe"]},{"name":"Moldàvia","cities":["Chişinău","Tiraspol"]},{"name":"Moçambic","cities":["Maputo","Matola"]},{"cities":["Rundu","Windhoek"],"name":"Namíbia"},{"cities":["Gaza"],"name":"Palestina"},{"name":"Romania","cities":["Bucarest","Iași"]},{"name":"Rwanda","cities":["Kigali"]},{"name":"Rússia","cities":["Kaliningrad"]},{"name":"Sudàfrica","cities":["Ciutat del Cap","Durban","Johannesburgo","Pretòria","Soweto"]},{"cities":["Manzini","Mbabane"],"name":"Swazilàndia"},{"name":"Síria","cities":["Alep","Damasc"]},{"name":"Turquia","cities":["Adana","Aintab","Ancyra","Bursa","Esmirna","Iconium","Istanbul"]},{"cities":["Dnipropetrovsk","Jarkov","Kíev"],"name":"Ucraïna"},{"name":"Xipre","cities":["Limassol","Nicòsia"]},{"name":"Zimbabwe","cities":["Bulawayo","Harare"]},{"cities":["Kitwe","Lusaka"],"name":"Zàmbia"}]},{"countries":[{"name":"Aràbia Saudita","cities":["Al-Riyad","Gidda","La Meca"]},{"name":"Bahrain","cities":["Al-Manama"]},{"cities":["Hómiel","Maguilov","Minsk"],"name":"Bielorússia"},{"cities":["Moroni"],"name":"Comores"},{"name":"Djibouti","cities":["Yibuti"]},{"name":"Eritrea","cities":["Asmara","Cheren"]},{"name":"Etiòpia","cities":["Addis Abeba","Bahir Dar","Dire Dawa","Mek’elē","Nazrēt"]},{"name":"Iemen","cities":["Al Hudaydah","Sanaà"]},{"cities":["Bagdad","Basora"],"name":"Iraq"},{"name":"Kenya","cities":["Mombasa","Nairobi","Nakuru"]},{"name":"Kuwait","cities":["Al Ahmadi","Kuwait"]},{"cities":["Antananarivo","Toamasina"],"name":"Madagascar"},{"cities":["Mamoudzou"],"name":"Mayotte"},{"name":"Qatar","cities":["Doha"]},{"cities":["Kazán","Moscou","Nizhny Novgorod","Rostov del Don","Sant Petersburg"],"name":"Rússia"},{"cities":["Mogadixo"],"name":"Somàlia"},{"cities":["Kassala","Khartum","Port Sudan"],"name":"Sudan"},{"name":"Sudán del Sur","cities":["Juba","Malakal"]},{"cities":["Dar es Salaam","Dodoma"],"name":"Tanzània"},{"cities":["Donetsk","Luhansk"],"name":"Ucraïna"},{"cities":["Gulu","Kampala","Lira"],"name":"Uganda"}],"offset":"UTC+3"},{"offset":"UTC+3:30","countries":[{"name":"Iran","cities":["Isfahán","Karaj","Meixad","Qom","Tabriz","Teheran","Xiraz"]}]},{"countries":[{"cities":["Erevan"],"name":"Armènia"},{"cities":["Bakú","Gandja"],"name":"Azerbaidjan"},{"cities":["Abu Dhabi","Dubai"],"name":"Emirats Àrabs Units"},{"name":"Geòrgia","cities":["Kutaïsi","Tbilisi"]},{"name":"Illa de la Reunió","cities":["Saint-Denis"]},{"cities":["Port Louis","Vacoas"],"name":"Maurici"},{"name":"Oman","cities":["As Sīb al Jadīdah","Masqat"]},{"cities":["Samara","Toliatti"],"name":"Rússia"},{"cities":["Victòria"],"name":"Seychelles"}],"offset":"UTC+4"},{"countries":[{"name":"Afganistan","cities":["Kabul","Kandahar","Mazār-e Šarīf"]}],"offset":"UTC+4:30"},{"countries":[{"cities":["Aqtöbe"],"name":"Kazakhstan"},{"name":"Maldives","cities":["Malé"]},{"cities":["Faisalabad","Gujranwala","Hyderabad","Islamabad","Karachi","Lahore","Multan","Peshawar","Quetta","Rāwalpindi"],"name":"Pakistan"},{"name":"Rússia","cities":["Ekaterinburgo","Txeliàbinsk"]},{"cities":["Dushanbe","Khodjent"],"name":"Tadjikistan"},{"name":"Territoris Francesos del Sud","cities":["Port-aux-Français"]},{"name":"Turkmenistan","cities":["Aşgabat","Türkmenabat"]},{"cities":["Namangán","Taixkent"],"name":"Uzbekistan"}],"offset":"UTC+5"},{"offset":"UTC+5:30","countries":[{"name":"Sri Lanka","cities":["Colombo","Galkissa"]},{"name":"Índia","cities":["Ahmedabad","Bangalore","Calcuta","Chennai","Hyderabad","Kanpur","Mumbai","Nova Delhi","Pune","Surat"]}]},{"countries":[{"name":"Nepal","cities":["Biratnagur","Katmandú","Pokhara"]}],"offset":"UTC+5:45"},{"offset":"UTC+6","countries":[{"cities":["Chittagong","Comilla","Cox’s Bāzār","Dhaka","Jessore","Khulna","Narsingdi","Rajshahi","Rangpur","Tongi"],"name":"Bangladesh"},{"cities":["Timbu"],"name":"Bhutan"},{"name":"Kazakhstan","cities":["Almati","Astanà"]},{"cities":["Bixkek","Oix"],"name":"Kirguizistan"},{"name":"Rússia","cities":["Novossibirsk","Omsk"]},{"cities":[],"name":"Territori Britànic de lOceà Índic"}]},{"offset":"UTC+6:30","countries":[{"cities":["Naypyidaw","Yangon"],"name":"Birmània"},{"name":"Illes Cocos","cities":[]}]},{"countries":[{"name":"Cambodja","cities":["Nom Pen","Takeo"]},{"name":"Illa Christmas","cities":[]},{"cities":["Bandung","Bekasi","Depok","Jakarta","Medan","Palembang","Semarang","South Tangerang","Surabaya","Tangerang"],"name":"Indonèsia"},{"cities":["Pakxe","Vientiane"],"name":"Laos"},{"name":"Mongòlia","cities":["Khovd"]},{"name":"Rússia","cities":["Krasnoyarsk","Novokuznetsk"]},{"cities":["Bangkok","Chon Buri","Mueang Nonthaburi","Mueang Samut Prakan","Udon Thani"],"name":"Tailàndia"},{"cities":["Biên Hòa","Ciudad Ho Chi Minh","Da Nang","Haiphong","Hanoi","Hué","Nha Trang"],"name":"Vietnam"}],"offset":"UTC+7"},{"countries":[{"cities":["Mandurah","Perth","Western Australia"],"name":"Austràlia"},{"name":"Brunei","cities":["Bandar Seri Begawan"]},{"cities":["Antipolo","Bacólod","Ciudad de Cebú","Dadiangas","Davao City","Manila","Zamboanga City"],"name":"Filipines"},{"cities":[],"name":"Hong Kong"},{"name":"Indonèsia","cities":["Banjarmasin","City of Balikpapan","Makassar"]},{"name":"Macau","cities":[]},{"cities":["Klang","Kota Bharu","Kuala Lumpur"],"name":"Malàisia"},{"cities":["Erdenet","Ulan Bator"],"name":"Mongòlia"},{"cities":["Irkutsk"],"name":"Rússia"},{"name":"Singapur","cities":[]},{"name":"Taiwan","cities":["Kaohsiung","Taipei"]},{"cities":["Canton","Chongqing","Dongguan","Nanquín","Pequín","Shenzhen","Tianjin","Txengdu","Wuhan","Xangai"],"name":"Xina"}],"offset":"UTC+8"},{"countries":[{"cities":["Hamhung","Pyongyang"],"name":"Corea del Nord"}],"offset":"UTC+8:30"},{"countries":[{"name":"Austràlia","cities":[]}],"offset":"UTC+8:45"},{"countries":[{"name":"Corea del Sud","cities":["Busán","Inchon","Seül"]},{"cities":["Ambon City","Jayapura"],"name":"Indonèsia"},{"cities":["Osaka","Tòquio","Yokohama"],"name":"Japó"},{"cities":[],"name":"República de Palau"},{"name":"Rússia","cities":["Chitá","Yakutsk"]},{"cities":["Dili"],"name":"Timor Oriental"}],"offset":"UTC+9"},{"countries":[{"name":"Austràlia","cities":["Darwin","Territori del Nord"]}],"offset":"UTC+9:30"},{"countries":[{"cities":["Brisbane","Costa Dorada","Queensland"],"name":"Austràlia"},{"cities":["Agana"],"name":"Guam"},{"cities":[],"name":"Illes Mariannes del Nord"},{"name":"Micronèsia","cities":["Moen"]},{"name":"Papua Nova Guinea","cities":["Lae","Puerto Moresby"]},{"cities":["Khabàrovsk","Vladivostok"],"name":"Rússia"}],"offset":"UTC+10"},{"offset":"UTC+10:30","countries":[{"cities":["Adelaida","Adelaide Hills","South Australia"],"name":"Austràlia"}]},{"countries":[{"name":"Austràlia","cities":["Australian Capital Territory","Canberra","New South Wales","Sydney","Tasmania","Victoria"]},{"cities":["Kingston"],"name":"Illa Norfolk"},{"cities":["Palikir"],"name":"Micronèsia"},{"name":"Nova Caledònia","cities":["Numea"]},{"name":"Salomó","cities":["Honiara"]},{"name":"Vanuatu","cities":["Port Vila"]}],"offset":"UTC+11"},{"countries":[{"cities":["Suva"],"name":"Fiji"},{"cities":["Majuro"],"name":"Illes Marshall"},{"cities":[],"name":"Illes Perifèriques Menors dels EUA"},{"cities":["Tarawa"],"name":"Kiribati"},{"cities":[],"name":"Nauru"},{"name":"Rússia","cities":["Petropàvlovsk-Kamtxatski"]},{"name":"Tuvalu","cities":[]},{"cities":["Mata-Utu"],"name":"Wallis i Futuna"}],"offset":"UTC+12"},{"offset":"UTC+13","countries":[{"cities":[],"name":"Kiribati"},{"cities":["Auckland","Wellington"],"name":"Nova Zelanda"},{"name":"Tokelau","cities":[]},{"name":"Tonga","cities":["Nuku'alofa"]}]},{"offset":"UTC+13:45","countries":[{"cities":[],"name":"Nova Zelanda"}]},{"offset":"UTC+14","countries":[{"cities":["Tabwakea Village"],"name":"Kiribati"},{"cities":["Apia"],"name":"Samoa"}]}] \ No newline at end of file