Hello! Here is code for you if you want it. It's about 99% done. It'll work well as it is, there's just one command I haven't finished yet. I'll update here when I do. You can change the categories you think your game might support via changing &data.categories prco=category1.category2.category3.etc. And then the code needs no other updates.
@create +Prefs Code Object <PrCO>
@set prco=inherit
&data.categories prco=action.adventure.casual.comedy.conflict.mystery.public.romance.social
&c.+prefs prco=$+prefs:@pemit %#=[setq(p, pmatch(%#))]
[if(hasattr(%qp, _prefs.ratings),
[header([name(%qp)]'s +Prefs)]%r
[u(fn.displayprefs, %qp)]%r
[if(hasattr(%qp, _prefs.note),
%r%r[ansi(h, Note)]: [u(%qp/_prefs.note)]%r
)]
[footer()],
[alert(+Prefs, alert)] You have not set up +prefs yet! See +help +prefs for help.
)]
&c.+prefs_other prco=$+prefs *:@pemit %#=[setq(p, pmatch(%0))]
[if(%qp,
[if(hasattr(%qp, _prefs.ratings),
[header([name(%qp)]'s +Prefs)]%r
[u(fn.displayprefs, %qp)]%r
[if(hasattr(%qp, _prefs.note),
%r%r[ansi(h, Note)]: [u(%qp/_prefs.note)]%r
)]
[footer()],
[alert(+Prefs, alert)] [name(%qp)] has not set up +prefs.
)],
[alert(+Prefs, alert)] I can't find player '%0'. Please check your spelling.
)]
&fn.displayprefs prco=[setq(r, get(%0/_prefs.ratings))]
[iter(sort(u(data.categories), a, .),
[ljust(
ansi(
h, [capstr(%i0)]:
),
15)]
%b
[u(fn.dispref, %qr,%i0)],
.
,%r
)]
&fn.dispref prco=[repeat(
*,
after(
graball(%0, %1*, .),
:)
)]
&c.+prefs/list prco=$+prefs/list:@pemit %#=[header(Available +Pref Categories)]%r
[itemize(
iter(
sort(
u(data.categories), a, . , .
),
[capstr(%i0)],
., .
), .
)].%r
[footer()]
&c.+prefs/set prco=$+prefs/set *=*:@pemit %#=[setq(p, pmatch(%#))]
[if(u(fn.iscat?, %0),
[if(and(lte(%1, 5), gte(%1, 0)),
[if(u(fn.hascat?, %qp, %0),
[alert(+Prefs)] Changing %0 to %1.[set(%qp, _prefs.ratings:[setdiff(get(%qp/_prefs.ratings), [graball(get(%qp/_prefs.ratings), %0*, .)], .)].%0:%1)],
[alert(+Prefs)] Setting %0 to %1.[set(%qp, _prefs.ratings:[get(%qp/_prefs.ratings)].%0:%1)]
)],
[alert(+Prefs, alert)] You tried to set '%1'. You must set a rating of 0 to 5.
)],
[alert(+Prefs, alert)] I'm sorry but '%0' is not a category. Check +prefs/list for available categories.
)]
&fn.iscat? prco=[if(graball(u(data.categories), %0*, .),
1,
0
)]
&fn.hascat? prco=[if(graball(get(%0/_prefs.ratings), %1*, .),
1,
0
)]
&c.+prefs/note prco=$+prefs/note *:@pemit %#=[setq(p, pmatch(%#))][alert(+prefs)] Setting your Prefs Note to [setr(n, secure(%0))].[set(%qp, _prefs.note:%qn)]
&C.+PREF +Prefs Code Object <PrCO>=$+pref:@force %#=+prefs
&C.+PREF_OTHER +Prefs Code Object <PrCO>=$+pref *:@force %#=+prefs %0
&C.+PREF/SET +Prefs Code Object <PrCO>=$+pref/set *=*:@force %#=+prefs/set %0=%1
&C.+PREF/NOTE +Prefs Code Object <PrCO>=$+pref/note *:@force %#=+prefs/note %0
&C.+PREF/NOTE_CLEAR +Prefs Code Object <PrCO>=$+pref/note:@force %#=+prefs/note
&C.+PREFS/NOTE_CLEAR +Prefs Code Object <PrCO>=$+prefs/note:@pemit %#=[setq(p, [pmatch(%#)])][alert(+Prefs, alert)] Clearing your note it was:%R[get(%qp/_prefs.note)][set(%qp, _prefs.note:)]
&c.+prefs/find prco=$+prefs/find *:@pemit %#=[if(u(fn.iscat?, %0), [header(+Prefs/Find: %0)]%r%b[columns(squish(iter(filter(fil.hasprefs, lwho()), if(gte([after(graball([get(%i0/_prefs.ratings)], %0*, .), :)], 3), [name(%i0)]: [u(fn.dispref, [get(%i0/_prefs.ratings)], %0)]~))), 20, ~, 0)]%rThese are all the people [ansi(h, currently connected)] with %0 at 3+.%r[footer()], [alert(+prefs, alert)] Sorry %0 is not a category. Check +prefs/list.)]
&fil.hasprefs prco=FIL.HASPREFS: hasattr(%0, _prefs.ratings)
You can c/p this into Muxify and then be able to c/p it onto your game.
added aliases so you can do +pref/<stuff>.
Also +pref/note by itself will now clear your note.