Software /
code /
prosody-modules
Diff
mod_report_affiliations/traits.lib.lua @ 6058:e905ef16efb7
mod_report_affiliations: New module for XEP-0489: Reporting Account Affiliations
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Fri, 22 Nov 2024 19:05:49 +0000 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mod_report_affiliations/traits.lib.lua Fri Nov 22 19:05:49 2024 +0000 @@ -0,0 +1,58 @@ +local known_traits = {}; + +local function trait_added(event) + local trait = event.item; + local name = trait.name; + if known_traits[name] then return; end + + known_traits[name] = trait.probabilities; +end + +local function trait_removed(event) + local trait = event.item; + known_traits[trait.name] = nil; +end + +module:handle_items("account-trait", trait_added, trait_removed); + +local function bayes_probability(prior, prob_given_true, prob_given_false) + local numerator = prob_given_true * prior; + local denominator = numerator + prob_given_false * (1 - prior); + return numerator / denominator; +end + +local function prob_is_bad(traits, prior) + prior = prior or 0.50; + + for trait, state in pairs(traits) do + local probabilities = known_traits[trait]; + if probabilities then + if state then + prior = bayes_probability( + prior, + probabilities.prob_bad_true, + probabilities.prob_bad_false + ); + else + prior = bayes_probability( + prior, + 1 - probabilities.prob_bad_true, + 1 - probabilities.prob_bad_false + ); + end + end + end + + return prior; +end + +local function get_probability_bad(username, prior) + local user_traits = {}; + module:fire_event("get-account-traits", { username = username, host = module.host, traits = user_traits }); + local result = prob_is_bad(user_traits, prior); + return result; +end + +return { + get_probability_bad = get_probability_bad; +};