Skip to content
Extraits de code Groupes Projets
Valider f5ede77a rédigé par Aorimn's avatar Aorimn
Parcourir les fichiers

Ajout d'un module pour avoir des citations de Kaamelott

Le script get_kaamelott.rb doit être lancé pour que le module
fonctionne.
parent bf87c30b
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
package Kaamelott; # command = kaamelott
# ./get_kaamelott.rb > Data/kaamelott_citations.dat
use JSON;
# Format :
# "pseudo 1" => {
# "quote 1" => {
# "acteur" => "",
# "livre" => "",
# "episode numero" => int,
# "episode titre" => ""
# },
# "quote 2" => ...
# },
# "pseu...
# Cf kaamelott_init_quotes pour voir le remplissage
my $person_quotes = undef;
# À l'inverse, on a ce type de format :
# "quote 1" => {
# "pseudo" => {
# [pareil ici]
# }
# }
my $quote_people = undef;
# Format :
# "lc vrai-pseudo-1 =~ s/-/ /" => "Vrai Pseudo 1",
# "lc vrai-pseudo-2 =~ s/-/ /" => ...
my $people = undef;
# ###
# kaamelott_main
# Affiche des citations de Kaamelott
#
# Usage :
# !kaamelott [<personnage>] [<regex>]
# ###
sub kaamelott_main
{
my ($conn, $event , $reply_to, $ref_params) = @_;
if(!defined($person_quotes) or !defined($quote_people))
{
kaamelott_init_quotes;
}
if(defined($ref_params->[0]))
{
my $ret = kaamelott_quote_from_person_or_regex(
$reply_to,
$ref_params
);
return 0 unless $ret;
}
else
{
kaamelott_display_quote(
$reply_to,
kaamelott_random_quote(keys(%{$quote_people}))
);
}
return 1;
} # Fin kaamelott_main
# ###
# kaamelott_init_quotes
# Initialisation de la variables des quotes
# ###
sub kaamelott_init_quotes
{
local $/ = undef;
open FILE, '<', 'Data/kaamelott_citations.dat' or return 0;
binmode FILE;
my $buffer = <FILE>;
close FILE;
$person_quotes = decode_json($buffer);
$quote_people = {};
$people = {};
foreach my $person (keys %{$person_quotes})
{
foreach my $quote (keys %{$person_quotes->{$person}})
{
$quote_people->{$quote} = {
$person => $person_quotes->{$person}->{$quote}
};
}
my $sanitized = kaamelott_sanitize($person);
$people->{$sanitized} = $person;
}
return 1;
} # Fin kaamelott_init_quotes
# ###
# kaamelott_sanitize
# Sanitize les noms des gens de la façon suivante :
# espace -> tiret
# lowercase
# ###
sub kaamelott_sanitize
{
my $person = shift;
$person =~ s/ /-/g;
return lc $person;
} # Fin kaamelott_sanitize
# ###
# kaamelott_sanitize_from_user
# Sanitize les noms des gens de la façon suivante :
# lowercase
# ###
sub kaamelott_sanitize_from_user
{
my $person = shift;
return lc $person;
} # Fin kaamelott_sanitize_from_user
# ###
# kaamelott_random_quote
# Choix d'une quote aléatoirement dans un tableau de quotes donné
# ###
sub kaamelott_random_quote
{
my @choices = @_;
return $choices[int(rand($#choices + 1))];;
} # Fin kaamelott_random_quote
# ###
# kaamelott_display_quote
# Affichage d'une quote
# ###
sub kaamelott_display_quote
{
my ($reply_to, $quote) = @_;
my $quote_obj = $quote_people->{$quote};
my @people = keys(%{$quote_obj});
my $person = $people[0];
my $msg = "\x0309$person\x03 $quote";
if($quote_obj->{$person}->{'livre'})
{
$msg .= " \x0304[\x0303Livre ";
$msg .= $quote_obj->{$person}->{'livre'};
$msg .= "\x0304]";
}
if($quote_obj->{$person}->{'episode titre'})
{
$msg .= " \x0302";
$msg .= $quote_obj->{$person}->{'episode titre'};
}
$::displayer->sendto($reply_to, $msg);
return 1;
} # Fin kaamelott_display_quote
# ###
# kaamelott_quote_from_person_or_regex
# Récupération et affichage d'une quote
# ###
sub kaamelott_quote_from_person_or_regex
{
my ($reply_to, $ref_params) = @_;
my $person = undef;
my $regex = qr/.*/;
my @quotes = keys %{$quote_people};
my $sanitized = kaamelott_sanitize_from_user($ref_params->[0]);
if(defined($people->{$sanitized}) and defined($person_quotes->{$people->{$sanitized}}))
{
shift @{$ref_params};
$person = $people->{$sanitized};
@quotes = keys %{$person_quotes->{$person}};
}
if(defined($ref_params->[0]))
{
my $tmp = join('\s+', @{$ref_params});
if(!eval{ $regex = qr/$tmp/i })
{
$::displayer->sendto($reply_to, "'$tmp' doesn't seem to be a correct regex");
return 1;
}
}
my @choices = ();
foreach my $quote (@quotes)
{
if($quote =~ $regex)
{
push @choices, $quote;
}
}
if(@choices)
{
kaamelott_display_quote($reply_to, kaamelott_random_quote(@choices));
}
else
{
$::displayer->sendto($reply_to, 'Quote not found');
}
return 1;
} # Fin kaamelott_quote_from_person_or_regex
# ###
# kaamelott_help
# Affiche l'aide de la commande '!kaamelott'
# ###
sub kaamelott_help
{
my ($conn, $event, $reply_to, $ref_params) = @_;
$conn->privmsg($reply_to, "`".$Config::command_sign."kaamelott [<personnage>] [<regex>]` => "
."Affiche une citation de Kaamelott, dans les citation de <personnage> si fourni, "
."contenant <regex> si fourni (https://fr.wikiquote.org/wiki/Kaamelott)");
return 1;
} # Fin join_help
1;
__END__
#!/usr/bin/env ruby
# ./get_kaamelott.rb > Data/kaamelott_citations.dat
require 'nokogiri'
require 'open-uri'
$base = 'https://fr.wikiquote.org'
def convert content
content.gsub("\n", ' ').gsub('"', '\\"').gsub('’', "'")
end
def puts_new_page node
link = node.xpath('.//a').attr('href')
new_doc = Nokogiri::HTML(open($base + link))
new_span = true
new_doc.xpath('//div[@id="mw-content-text"]//*[@class = "citation" or @class = "ref"]').each do | node |
if node.name == 'span'
puts ' },' unless new_span
puts " \"#{convert node.content}\": {"
new_span = false
elsif node.name == 'div'
node.content =~ /^([^,]+),\s+\w+,\s+Livre\s+([IVX]+),[^\d\w]*(?:(\d+)[^:]*:\s+)?"?([^,"]+)"?,/
puts " \"acteur\": \"#{$1}\","
puts " \"livre\": \"#{$2}\","
puts " \"episode numero\": \"#{$3}\","
puts " \"episode titre\": \"#{$4}\""
else
raise "Shit! Got this: #{node}"
end
end
end
new_a = true
new_span = false
puts '{'
doc = Nokogiri::HTML(open($base + '/wiki/Kaamelott'))
doc.xpath('//div[@id="mw-content-text"]//*[@class = "extiw" or @class = "citation" or @class = "ref" or self::dl]').each do | node |
if node.name == 'a'
puts ' }' unless new_a
puts " }," unless new_a
puts " \"#{convert node.content}\": {"
new_a = false
new_span = true
elsif node.name == 'dl'
puts_new_page node
break if node.xpath('.//a')[0].content == 'Yvain'
elsif node.name == 'span'
puts ' },' unless new_span
puts " \"#{convert node.content}\": {"
new_span = false
elsif node.name == 'div'
# puts node.content
node.content =~ /^([^,]+),\s+\w+,\s+Livre\s+([IVX]+),\s*(?:ép.\s*)?(\d+)[^:]*:\s*([^,]+),/
puts " \"acteur\": \"#{$1}\","
puts " \"livre\": \"#{$2}\","
puts " \"episode numero\": \"#{$3}\","
puts " \"episode titre\": \"#{$4}\""
else
raise "Shit! Got this: #{node}"
end
end
puts ' }'
puts ' }'
puts '}'
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter