Mercurial > prosody-modules
comparison mod_report_affiliations/traits.lib.lua @ 6030: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 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 6029:cc665f343690 | 6030:e905ef16efb7 |
|---|---|
| 1 local known_traits = {}; | |
| 2 | |
| 3 local function trait_added(event) | |
| 4 local trait = event.item; | |
| 5 local name = trait.name; | |
| 6 if known_traits[name] then return; end | |
| 7 | |
| 8 known_traits[name] = trait.probabilities; | |
| 9 end | |
| 10 | |
| 11 local function trait_removed(event) | |
| 12 local trait = event.item; | |
| 13 known_traits[trait.name] = nil; | |
| 14 end | |
| 15 | |
| 16 module:handle_items("account-trait", trait_added, trait_removed); | |
| 17 | |
| 18 local function bayes_probability(prior, prob_given_true, prob_given_false) | |
| 19 local numerator = prob_given_true * prior; | |
| 20 local denominator = numerator + prob_given_false * (1 - prior); | |
| 21 return numerator / denominator; | |
| 22 end | |
| 23 | |
| 24 local function prob_is_bad(traits, prior) | |
| 25 prior = prior or 0.50; | |
| 26 | |
| 27 for trait, state in pairs(traits) do | |
| 28 local probabilities = known_traits[trait]; | |
| 29 if probabilities then | |
| 30 if state then | |
| 31 prior = bayes_probability( | |
| 32 prior, | |
| 33 probabilities.prob_bad_true, | |
| 34 probabilities.prob_bad_false | |
| 35 ); | |
| 36 else | |
| 37 prior = bayes_probability( | |
| 38 prior, | |
| 39 1 - probabilities.prob_bad_true, | |
| 40 1 - probabilities.prob_bad_false | |
| 41 ); | |
| 42 end | |
| 43 end | |
| 44 end | |
| 45 | |
| 46 return prior; | |
| 47 end | |
| 48 | |
| 49 local function get_probability_bad(username, prior) | |
| 50 local user_traits = {}; | |
| 51 module:fire_event("get-account-traits", { username = username, host = module.host, traits = user_traits }); | |
| 52 local result = prob_is_bad(user_traits, prior); | |
| 53 return result; | |
| 54 end | |
| 55 | |
| 56 return { | |
| 57 get_probability_bad = get_probability_bad; | |
| 58 }; |
