From d2da9fcd250533bee5df17bd182648a8cea0d7b0 Mon Sep 17 00:00:00 2001 From: Zoffix Znet Date: Sun, 6 Dec 2015 18:07:19 -0500 Subject: Prerelease --- META.info | 14 ++-- README.md | 163 +++++++++++++++++++++++++++++++++++++ README.pod | 37 --------- examples/bot.pl6 | 4 +- get-TZs.pl | 54 ------------ lib/IRC/Client.pm6 | 16 ++-- lib/IRC/Client/Plugin.pm6 | 8 -- lib/IRC/Client/Plugin/Debugger.pm6 | 9 +- lib/IRC/Client/Plugin/HNY.pm6 | 26 ------ lib/IRC/Client/Plugin/PingPong.pm6 | 10 +++ lib/IRC/Grammar/Actions.pm6 | 9 +- t/00-use.t | 13 +++ test.p6 | 22 ----- tzs.json | 1 - 14 files changed, 214 insertions(+), 172 deletions(-) create mode 100644 README.md delete mode 100644 README.pod delete mode 100644 get-TZs.pl delete mode 100644 lib/IRC/Client/Plugin.pm6 delete mode 100644 lib/IRC/Client/Plugin/HNY.pm6 create mode 100644 lib/IRC/Client/Plugin/PingPong.pm6 create mode 100644 t/00-use.t delete mode 100644 test.p6 delete mode 100644 tzs.json 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 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 - -=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 - -=head1 BUGS - -To report bugs or request features, please use -L - -=head1 AUTHOR - -Zoffix Znet L - -=head1 LICENSE - -You can use and distribute this module under the same terms as Perl 6 -itself. See the C 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('')->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__ - -
-

UTC-9

-
- -
-
\ 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"; - } -} 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 eq 'PING'; + my $res = "PONG {$irc.nick} $msg[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: $>>.made } method message ($/) { my $pref = $/; my %args = command => ~$/; - if ( $pref.defined ) { - %args = ~$pref; - } - else { - %args = $pref».Str; + for qw/nick user host/ { + $pref{$_}.defined or next; + %args{$_} = $pref{$_}.Str; } + %args = ~$pref if $pref.defined; my $p = $/; 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 -- cgit v1.1