All pastes #84128 Raw Edit

Stuff

public text v1 · immutable
·published 2006-07-10 16:18 UTC
rendered paste body
%%%-------------------------------------------------------------------
%%% File    : avatar_trust_helper.erl
%%% Author  : Gordon Guthrie <gordon@bulbasaur.politicaldiscussion.org>
%%% Description : 
%%%
%%% Created : 16 Jan 2004 by Gordon Guthrie <gordon@bulbasaur.politicaldiscussion.org>
%%% Revision(HB): 03/08/05 Added try messages handling
%%% Revision(HB): 04/08/05 Added trust history support
%%% Revision(HB): 08/08/05 Fixed untrust message handling
%%%                        Modified timestamps for history messages
%%%-------------------------------------------------------------------
-module(avatar_trust_helper).
-copyright('Gordon Guthrie (c) 2003').

-include("avatar_records.hrl").

%%% This function is only for use in module avatar
-export([handletrusts/5]).

%% ********************************************************************
%%
%% handletrusts is called by the main avatar module to handle all the
%% trust type messages:
%% + trust
%% + trusted by
%% + untrust
%% + untrusted by
%% + distrust
%% + undistrust
%% + distrusted by
%% + undistrusted by
%% + block
%% + blocked by
%% + unblock
%% + unblocked by
%% + untry
%% + untried by
%%
%% This function returns a message {ok, Newstate} or exits
%% Newstate is the new version of the state of the avatar
%%
%% ********************************************************************

handletrusts(Message, MyName, Trusts, Notify, AdminMsgs) ->

    %%
    %% First the active voice - message originating from the avatar's owner
    %%

    case Message of

	{"trust", Name} ->
	    Relationship = {"trust", Name, "about", "everything"},
	    {AddHistory, NewTrusts2} = apply_trust(Relationship, MyName, Trusts),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    if 
		AddHistory == true -> addhistory(MyName, Relationship);
		true               -> ok
	    end;

	{"trust", Name, "about", Topic} ->
	    Relationship = {"trust", Name, "about", Topic},
	    {AddHistory, NewTrusts2} = apply_trust(Relationship, MyName, Trusts), 
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    if 
		AddHistory == true -> addhistory(MyName, Relationship);
		true               -> ok
	    end;

	{"untrust", Name} ->
	    NewTrusts2 = lists:delete({"trust", Name, "about", "everything"}, Trusts),
	    addhistory(MyName, {"untrust",Name,"about","everything"}),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    avatar:trust_message(Name, {"untrusted by", MyName, "about", "everything"});

	{"untrust", Name, "about", Topic} ->
	    NewTrusts2 = lists:delete({"trust", Name, "about", Topic}, Trusts),
	    addhistory(MyName, {"untrust",Name,"about",Topic}),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    avatar:trust_message(Name, {"untrusted by", MyName, "about", Topic});

	{"distrust", Name} ->
	    Relationship = {"distrust", Name, "about", "everything"},
	    NewTrusts = removetrust(Trusts, {false, Name, "about", "everything"}),
	    NewTrusts2 = addtrust(NewTrusts, Relationship),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    case NewTrusts of
		Trusts -> avatar:trust_message(Name, {"distrusted by", MyName, "about", "everything"}),
			  addhistory(MyName, Relationship);
		    _      -> ok
	    end;
	
	{"distrust", Name, "about", Topic} ->
	    Relationship = {"distrust", Name, "about", Topic},
	    NewTrusts = removetrust(Trusts, {false, Name, "about", Topic}),
	    NewTrusts2 = addtrust(NewTrusts, Relationship),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    case NewTrusts of
		Trusts -> avatar:trust_message(Name,{"distrusted by",MyName,"about",Topic}),
			  addhistory(MyName, Relationship);
		_      -> ok
	    end;
	
	{"undistrust", Name} ->
	    NewTrusts2 = removetrust(Trusts,{"distrust",Name,"about","everything"}),
	    addhistory(MyName, {"undistrust", Name, "about", "everything"}),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    avatar:trust_message(Name, {"undistrusted by",MyName,"about","everything"});

	{"undistrust", Name, "about", Topic} ->
	    NewTrusts2 = lists:delete({"distrust", Name, "about", Topic}, Trusts),
	    addhistory(MyName, {"undistrust", Name, "about", Topic}),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    avatar:trust_message(Name,{"undistrusted by",MyName,"about",Topic});

	{"block", Name} ->
	    Relationship = {"block", Name, "about", "everything"},
	    NewTrusts = removetrust(Trusts, {false, Name, "about", "everything"}),
	    NewTrusts2 = addtrust(NewTrusts, Relationship),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    case NewTrusts of
		Trusts -> avatar:trust_message(Name,{"blocked by",MyName,"about","everything"}),
			  addhistory(MyName, Relationship);
		_      -> ok
	    end;

	{"block", Name, "about", Topic} ->
	    Relationship = {"block", Name, "about", Topic},
	    NewTrusts = removetrust(Trusts, {false, Name, "about", Topic}),
	    NewTrusts2 = addtrust(NewTrusts, Relationship),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    case NewTrusts of
		Trusts -> avatar:trust_message(Name,{"blocked by",MyName,"about",Topic}),
			  addhistory(MyName, Relationship);
		_      -> ok
	    end;
	
	{"unblock", Name} ->
	    NewTrusts2 = lists:delete({"block", Name, "about", "everything"},Trusts),
	    addhistory(MyName, {"unblock",Name,"about","everything"}),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    avatar:trust_message(Name, {"unblocked by",MyName,"about","everything"});

	{"unblock", Name, "about", Topic} ->
	    NewTrusts2 = lists:delete({"block", Name, "about", Topic}, Trusts),
	    addhistory(MyName, {"unblock", Name, "about", Topic}),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    avatar:trust_message(Name, {"unblocked by",MyName,"about",Topic});
	
	{"try", Name} ->
	    Relationship = {"try", Name, "about", "everything", "for", "3"},
	    NewTrusts2 = addtrust(Trusts, Relationship),
	    addhistory(MyName, Relationship),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    avatar:trust_message(Name, {"tried by",MyName,"about","everything","for","3"});

	{"try", Name, "for", Number} ->
	    Relationship = {"try", Name, "about", "everything", "for", Number},
	    NewTrusts2 = addtrust(Trusts, Relationship),
	    addhistory(MyName, Relationship),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    avatar:trust_message(Name, {"tried by",MyName,"about","everything","for",Number});

	{"try", Name, "about", Topic} ->
	    Relationship = {"try", Name, "about", Topic, "for", "3"},
	    NewTrusts2 = addtrust(Trusts, Relationship),
	    addhistory(MyName, Relationship),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    avatar:trust_message(Name, {"tried by",MyName,"about",Topic,"for","3"});
	
	{"try", Name, "about", Topic, "for", Number} ->
	    Relationship = {"try", Name, "about", Topic, "for", Number},
	    NewTrusts2 = addtrust(Trusts, Relationship),
	    addhistory(MyName, Relationship),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    avatar:trust_message(Name, {"tried by",MyName,"about",Topic,"for",Number});
	    
	{"untry", Name} ->
	    TryRelation = getrelation("try", Name, "everything", Trusts),
	    NewTrusts2 = lists:delete(TryRelation, Trusts),
	    addhistory(MyName, {"untry", Name, "about", "everything"}),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    avatar:trust_message(Name, {"untried by", MyName, "about", "everything"});

	{"untry", Name, "about", Topic} ->
	    TryRelation = getrelation("try", Name, Topic, Trusts),
	    NewTrusts2 = lists:delete(TryRelation, Trusts),
	    addhistory(MyName, {"untry", Name, "about", Topic}),
	    NewNotify=Notify,
	    NewAdminMsgs = AdminMsgs,
	    avatar:trust_message(Name, {"untried by", MyName, "about", Topic});

	%%
	%% Now the passive voice, messages originating from other avatars
	%%

	{"trusted by", Name, "about", Topic} ->
	    Relationship = {"trusted by", Name , "about", Topic},
	    NewTrusts = removetrust(Trusts,  {true, Name, "about", Topic}),
	    NewTrusts2 = addtrust(NewTrusts, Relationship),
	    addhistory(MyName, Relationship),
	    {ok, NewNotify, NewAdminMsgs} = avatar_notification_helper:handlenotifications(MyName,Relationship,Notify,AdminMsgs);

	{"untrusted by", Name, "about", Topic} ->
	    Relationship = {"untrusted by", Name, "about", Topic},
	    NewTrusts2 = lists:delete({"trusted by", Name, "about", Topic}, Trusts),
	    addhistory(MyName, Relationship),
	    {ok, NewNotify, NewAdminMsgs} = avatar_notification_helper:handlenotifications(MyName,Relationship,Notify,AdminMsgs);

	{"distrusted by", Name, "about", Topic} ->
	    Relationship = {"distrusted by", Name, "about", Topic},
	    NewTrusts = removetrust(Trusts,  {true, Name, "about", Topic}),
	    NewTrusts2 = addtrust(NewTrusts, Relationship),
	    addhistory(MyName, Relationship),
	    {ok, NewNotify, NewAdminMsgs} = avatar_notification_helper:handlenotifications(MyName,Relationship,Notify,AdminMsgs);

	{"undistrusted by", Name, "about", Topic} ->
	    Relationship = {"undistrusted by", Name, "about", Topic},
	    NewTrusts2 = lists:delete({"distrusted by", Name, "about",
				       Topic}, Trusts),
	    addhistory(MyName, {"undistrusted by", Name, "about", Topic}),
	    {ok, NewNotify, NewAdminMsgs} = avatar_notification_helper:handlenotifications(MyName,Relationship,Notify,AdminMsgs);

	{"blocked by", Name, "about", Topic} ->
	    Relationship = {"blocked by", Name, "about", Topic},
	    NewTrusts = removetrust(Trusts, {true, Name, "about", Topic}),
	    NewTrusts2 = addtrust(NewTrusts, Relationship),
	    addhistory(MyName, Relationship),
	    {ok, NewNotify, NewAdminMsgs} = avatar_notification_helper:handlenotifications(MyName,Relationship,Notify,AdminMsgs);

	{"unblocked by", Name, "about", Topic} ->
	    Relationship = {"unblocked by", Name, "about", Topic},
	    NewTrusts2 = lists:delete({"blocked by", Name, "about", Topic}, Trusts),
	    addhistory(MyName, {"unblocked by", Name, "about", Topic}),
	    {ok, NewNotify, NewAdminMsgs} = avatar_notification_helper:handlenotifications(MyName,Relationship,Notify,AdminMsgs);

	{"tried by", Name, "about", Topic, "for", Number} ->
	    Relationship = {"tried by", Name, "about", Topic, "for", Number},
	    NewTrusts2 = addtrust(Trusts, Relationship),
	    addhistory(MyName, Relationship),
	    {ok, NewNotify, NewAdminMsgs} = avatar_notification_helper:handlenotifications(MyName,Relationship,Notify,AdminMsgs);

	{"untried by", Name, "about", Topic} ->
	    Relationship = {"untried by", Name, "about", Topic},
	    TriedRelation = getrelation("tried by", Name, Topic, Trusts),
	    NewTrusts2 = lists:delete(TriedRelation, Trusts),
	    addhistory(MyName, {"untried by", Name, "about", Topic}),
	    {ok, NewNotify, NewAdminMsgs} = avatar_notification_helper:handlenotifications(MyName,Relationship,Notify,AdminMsgs);

	%%
	%% Anything else we just die
	%%
	_Else ->
	    NewTrusts2 = scratch,
	    NewHistory = scratch,
	    NewNotify=scratch,
	    NewAdminMsgs=scratch,
	    exit("unexpected trust message being handled", Message)
    end,

    {ok,NewTrusts2,NewNotify,NewAdminMsgs}. % Reply

%% ********************************************************************
%%
%% addtrust adds a trust to the trust list
%% 
%% the trust is passed in in the variable Relationship which is a tuple
%% with the following structure
%%
%% * the name of the avatar
%% + the name of the relationship, eg:
%%   + trust
%%   + trusted by
%%   + distrust
%%   + distrusted by
%%   + block
%%   + blocked by
%%   + try
%%   + tried by
%% + the topic (or "everything")
%%
%% ********************************************************************
addtrust(Trusts, Relationship) -> [Relationship|Trusts].
%    case lists:member(Relationship, Trusts) of
%	false -> [Relationship | Trusts]; 
%	true  -> Trusts
%    end.	

%% ********************************************************************
%%
%% removetrust removes a trust from the trust list with this profile
%% 
%% Trust type is the suffix i.e. "trust" -> "" and "trusted by" -> "by"
%% (Used to overwrite trusts of the same type).
%%
%% ********************************************************************
removetrust(Trusts, {Suffix, Person, "about", Topic}) -> 
    R = fun(X) ->
		case {Suffix, X} of
		    {true, {Full, Person, "about", Topic}} ->
			not lists:suffix(" by", Full);
		    {false, {Full, Person, "about", Topic}} ->
			lists:suffix(" by", Full);
		    {true, {"tried by", Person, "about", Topic, "for", _N}} ->
			false;
		    {false, {"try", Person, "about", Topic, "for", _N}} ->
			false;
		    _Else ->
			true
		end
	end,
    lists:filter(R, Trusts).

%% ********************************************************************
%%
%% apply_trust is a work around that gets us away from a compiler
%% error (no it isn't says conrad...)
%% 
%% ********************************************************************
apply_trust({"trust", Name, "about", Topic}, MyName, Trusts) -> 
    NewTrusts = removetrust(Trusts, {false, Name, "about", Topic}),
    case NewTrusts of
	Trusts ->
	    avatar:trust_message(Name, {"trusted by", MyName, "about", Topic}),
	    {true, addtrust(NewTrusts, {"trust", Name , "about", Topic})};
	_ ->
	    {false, addtrust(NewTrusts, {"trust", Name , "about", Topic})}
    end.
  
%% ********************************************************************
%%
%% Gets a type of relationship based on the name and topic.
%% 
%% ********************************************************************
getrelation(Type, Name, Topic, Relationships) ->
    TryTuples = avatar_utilities:filtertrustsbytype(Type, Relationships),
    NameTuples = avatar_utilities:filtertrustsbyname(Name, TryTuples),
    TopicTuples = avatar_utilities:filtertrustsbytopic(Topic, NameTuples),
    if
	length(TopicTuples) > 0 -> lists:nth(1, TopicTuples);
	true                    -> null
    end.

%% ********************************************************************
%%
%% Adds a new trust in the Trust History.
%% 
%% Takes a normal relationship, adds a timestamp to it and adds it to
%% the current history.
%% 
%% ********************************************************************
addhistory(Avatar, Relationship) ->
    NewHistory = {Relationship, "on", calendar:now_to_datetime(now())},
    socket:call(data_access,write_history,{Avatar,NewHistory}).