Skip to content

Madokaのログ記録の流れ

Kosuke Yamashita edited this page Aug 22, 2021 · 5 revisions

plugin/server/種類.mpi に処理が書かれており、メッセージの種類に合わせた処理が実行される。その際に以下を呼ぶ。

&mes(メッセージ, $chanr);

mes 関数

madoka.pl の662行。

sub mes {
  # 引数
  my($mes, $chan) = @_;

  # 改行コードを消す
  $mes =~ s/\r*\n$//;

  # メッセージをキャッシュに残す
  if ($yr_cache && $chan ne 'D') {
    push(@cache_mes, $mes);
    shift(@cache_mes) if $#cache_mes > $yr_cache;
  }

  # ログ記録対象チャンネルならばログに残す
  &Log("$mes\n", $chan || 'ALL') if &list_exist($plugin_list, 'log');
}

各種メッセージごとの処理

PRIVMSG

# madoka.pl L156
$chl_header = '\#\&\+\!\%';

    if ($chanr =~ /^[$chl_header]/) {
      if (&list_exist($ls_mem{$chanr}, $from, "\+$from", "\@$from") &&
          &list_exist($chl, $chanr)) {
        &mes("<$chanv:$from> $mesl\n", $chanr);
      } else {
        &mes("($chanv:$from) $mesl\n", $chanr);
      }
    } else {
      &mes("=$from= $mesl\n", 'P');
    }

NOTICE

判定条件がPRIVMSGと同じだから、区別できないかもしれない。

  if ($chanr =~ /^[\#\&\+\!]/) {
    if (&list_exist($ls_mem{$chanr}, $from, "\+$from", "\@$from")) {
      &mes("<$chanv:$from> $mes\n", $chanr);
    } else {
      &mes("($chanv:$from) $mes\n", $chanr);
    }
  } else {
    &mes("=$from= $mes\n", 'P');
  }

TOPIC

&mes("Topic of channel $chanv by $from: $topicl\n", $chanr);

JOIN

  if ($wm) {
    # ...
    &mes("+ $from($where) to $chanv with +$wm\n", $chanr);
    # ...
  } else {
    # ...
    &mes("+ $from($where) to $chanv\n", $chanr);
    # ...
  }

PART

&mes("- $from from $chanv ($partl)\n", $chanr);

QUIT

  if (!$mes) {
    &mes("! $from\n", 'ALL');
  } else {
    &mes("! $from ($quitl)\n", 'ALL');
  }

KICK

&mes("- $who by $from from $chanv ($kickl)\n", $chanr);

NICK

  if ($from eq $us_nick) {
    &mes("[!] nick changed ($from -> $nick)\n", 'ALL');
    # ...
  } else {
    &mes("$from -> $nick\n", 'ALL');
  }

Auto down

&mes("[!] auto down\n", 'ALL');
Clone this wiki locally