diff --git a/INDEV b/INDEV index dfa95534..7a62c973 100644 --- a/INDEV +++ b/INDEV @@ -3737,3 +3737,7 @@ CHANGES: 12. don't fire user_mask_change oper notice for cloaks applied to new users. closes #111. actually always do it for remote users. #111. + + 13. implemented JELP MODEREQ. #63. + added outgoing JELP MODEREQ and MODEREP. + update Evented::Object. diff --git a/VERSION b/VERSION index 3dfbb469..87e3933a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -12.12 +12.13 diff --git a/lib/evented-object b/lib/evented-object index fd50b33c..e2f982be 160000 --- a/lib/evented-object +++ b/lib/evented-object @@ -1 +1 @@ -Subproject commit fd50b33c3bdd2f4e7f600b36e898ce19857f0629 +Subproject commit e2f982be8773ad743e6975dc4a39d2ed9ff2ec5f diff --git a/modules/Channel/ModeSync.module/JELP.module/JELP.json b/modules/Channel/ModeSync.module/JELP.module/JELP.json index d90e8460..3b6a7014 100644 --- a/modules/Channel/ModeSync.module/JELP.module/JELP.json +++ b/modules/Channel/ModeSync.module/JELP.module/JELP.json @@ -6,5 +6,5 @@ "description" : "JELP mode synchronization", "name" : "Channel::ModeSync::JELP", "package" : "M::Channel::ModeSync::JELP", - "version" : "0.1" + "version" : "0.3" } diff --git a/modules/Channel/ModeSync.module/JELP.module/JELP.pm b/modules/Channel/ModeSync.module/JELP.module/JELP.pm index 7fdf3dd8..7e3c2593 100644 --- a/modules/Channel/ModeSync.module/JELP.module/JELP.pm +++ b/modules/Channel/ModeSync.module/JELP.module/JELP.pm @@ -15,7 +15,65 @@ use 5.010; our ($api, $mod, $pool); -our %jelp_incoming_commands = (); -our %jelp_outgoing_commands = (); +our %jelp_incoming_commands = ( + MODEREQ => { + # : MODEREQ |* |* |* + params => '-source(server) * * *', + code => \&in_modereq + }, + MODEREP => { + # : MODEREP |* : + params => '-source(server) channel * *', + code => \&in_moderep + } +); + +our %jelp_outgoing_commands = ( + MODEREQ => \&out_modereq, + MODEREP => \&out_moderep +); + +my $handle_modereq; + +sub init { + $handle_modereq = M::Channel::ModeSync->can('handle_modereq') or return; + return 1; +} + +sub in_modereq { + my ($server, $msg, $source_serv, $ch_name, $target, $modes) = @_; + undef $ch_name if $ch_name eq '*'; + undef $target if $target eq '*'; + undef $modes if $modes eq '*'; + + # find a channel maybe. + # abort if a name was provided and we can't find it. + my $ch_maybe = $pool->lookup_channel($ch_name) or return + if defined $ch_name; + + return $handle_modereq->($msg, $source_serv, $ch_maybe, $target, $modes); +} + +sub in_moderep { + +} + +sub out_modereq { + my ($to_server, $source_serv, $ch_maybe, $serv_maybe, $modes_maybe) = @_; + sprintf ':%s MODEREQ %s %s %s', + $source_serv->id, + $ch_maybe ? $ch_maybe->name : '*', + $serv_maybe ? $serv_maybe->id : '*', + length $modes_maybe ? $modes_maybe : '*'; +} + +sub out_moderep { + my ($to_server, $source_serv, $channel, $serv_maybe, $mode_str) = @_; + sprintf ':%s MODEREP %s %s :%s', + $source_serv->id, + $channel->name, + $serv_maybe ? $serv_maybe->id : '*', + $mode_str; +} $mod diff --git a/modules/Channel/ModeSync.module/ModeSync.json b/modules/Channel/ModeSync.module/ModeSync.json index 48d7419b..8a721549 100644 --- a/modules/Channel/ModeSync.module/ModeSync.json +++ b/modules/Channel/ModeSync.module/ModeSync.json @@ -6,5 +6,5 @@ "description" : "improves channel mode synchronization", "name" : "Channel::ModeSync", "package" : "M::Channel::ModeSync", - "version" : "0.4" + "version" : "0.6" } diff --git a/modules/Channel/ModeSync.module/ModeSync.pm b/modules/Channel/ModeSync.module/ModeSync.pm index c52f5587..a3f2a0f1 100644 --- a/modules/Channel/ModeSync.module/ModeSync.pm +++ b/modules/Channel/ModeSync.module/ModeSync.pm @@ -62,4 +62,52 @@ sub cmodes_changed { } +# handle_modereq() +# +# $source_serv server object source +# +# $ch_maybe channel object or undef if it is for all channels +# +# $target server object target or undef if it is network-wide +# +# $modes string of mode letters in the perspective of the source server +# or undef if requesting all modes +# +sub handle_modereq { + my ($msg, $source_serv, $ch_maybe, $target, $modes) = @_; + + # if the modes are missing, a channel must be present. + # this indicates a network-wide sync of all modes on a channel. + return if !$ch_maybe && !defined $modes; + + my @forward_args = (modereq => $source_serv, $ch_maybe, $target, $modes); + + # this is not for me; forward. + if (defined $target && $target ne $me->id) { + $target = $pool->lookup_server($target) or return; + return $msg->forward_to($target, @forward_args); + } + + # Safe point - we will handle this request. + my @channels = $ch_maybe ? $ch_maybe : $pool->channels; + foreach my $channel (@channels) { + + # map mode letters in the perspective of $source_serv to names. + my @mode_names = map $source_serv->cmode_name($_), split //, $modes; + + # construct a mode string in the perspective of $me with these modes. + my $mode_str = $channel->mode_string_with($me, @mode_names); + next if !length $mode_str; + + $source_serv->{location}->fire_command(moderep => + $me, $channel, $target, $mode_str + ); + } + + # unless this was addressed specifically to me, forward. + $msg->forward(@forward_args) if !defined $target; + + return 1; +} + $mod diff --git a/modules/ircd.module/channel.module/channel.json b/modules/ircd.module/channel.module/channel.json index 16ab44ea..27850b34 100644 --- a/modules/ircd.module/channel.module/channel.json +++ b/modules/ircd.module/channel.module/channel.json @@ -8,5 +8,5 @@ "no_bless" : 1, "package" : "channel", "preserve_sym" : 1, - "version" : "12.09" + "version" : "12.12" } diff --git a/modules/ircd.module/channel.module/channel.pm b/modules/ircd.module/channel.module/channel.pm index 2265da51..d10731ce 100644 --- a/modules/ircd.module/channel.module/channel.pm +++ b/modules/ircd.module/channel.module/channel.pm @@ -431,6 +431,9 @@ sub handle_mode_string { } +sub modes_with { ... } +sub mode_string_with { ... } + # returns a +modes string. sub mode_string { _mode_string(0, @_) } sub mode_string_hidden { _mode_string(1, @_) }