guide on how to create the desired frame using Lum0x.
"I want to know the reaction rankings of the FIDs that have interacted with my most recent 100 casts. Who's been reacting to my posts the most?"
Step 1 : To determine the reaction rankings, we'll first need to identify the necessary data.
Retrieves and processes Casts for a specific user, calculates scores, and returns a sorted list of users. Lum0x.farcasterCast.getCastsByFid
async function searchMyFan(fid) {
let res = await Lum0x.farcasterCast.getCastsByFid({
fid: fid,
limit: 100
});
let casts = res.result.casts;
for (let cast of casts) {
processReaction(cast);
}
const sortedFids = getSortedScores();
sortedFids.splice(25);
let fids = '';
for (let info of sortedFids) {
fids += info.fid + ',';
}
fids = fids.slice(0, -1);
let displayNames = await getDisplayName(fids);
for (let i = 0; i < sortedFids.length; i++) {
sortedFids[i].display_name = displayNames[i];
}
return sortedFids;
}
Retrieves the display names of users given their FIDs Lum0x.farcasterUser.getUserByFids
async function getDisplayName(fids) {
let res = await Lum0x.farcasterUser.getUserByFids({
fids: fids
});
let users = res.users;
let displayNames = [];
for (let user of users) {
displayNames.push(user.display_name);
}
return displayNames;
}
Step 2 : To use Lum0x, you need to get an API key.
import { Lum0x } from "lum0x-sdk";
Lum0x.init('USE-YOUR-LUM0X-API-KEY');
let scoreBoard = {};
let reactionScore = 1;
let recastScore = 3;
// Sorts the scores of users in descending order.
function getSortedScores() {
const scoresArray = Object.entries(scoreBoard).map(([fid, score]) => ({
fid,
score
}));
scoresArray.sort((a, b) => b.score - a.score);
return scoresArray;
}
// Retrieves the display names of users given their FIDs.
async function getDisplayName(fids) {
let res = await Lum0x.farcasterUser.getUserByFids({
fids: fids
});
let users = res.users;
let displayNames = [];
for (let user of users) {
displayNames.push(user.display_name);
}
return displayNames;
}
// Updates the scoreBoard based on reactions and recasts for a given Cast.
function processReaction(cast) {
let reactions = cast.reactions.fids;
let recasts = cast.recasts.fids;
for (let reactionFid of reactions) {
if (scoreBoard[reactionFid] === undefined) {
scoreBoard[reactionFid] = 0;
}
scoreBoard[reactionFid] += reactionScore;
}
for (let recastFid of recasts) {
if (scoreBoard[recastFid] === undefined) {
scoreBoard[recastFid] = 0;
}
scoreBoard[recastFid] += recastScore;
}
}
/* Retrieves and processes Casts for a specific user,
calculates scores, and returns a sorted list of users.*/
async function searchMyFan(fid) {
let res = await Lum0x.farcasterCast.getCastsByFid({
fid: fid,
limit: 100
});
let casts = res.result.casts;
for (let cast of casts) {
processReaction(cast);
}
const sortedFids = getSortedScores();
sortedFids.splice(25);
let fids = '';
for (let info of sortedFids) {
fids += info.fid + ',';
}
fids = fids.slice(0, -1);
let displayNames = await getDisplayName(fids);
for (let i = 0; i < sortedFids.length; i++) {
sortedFids[i].display_name = displayNames[i];
}
return sortedFids;
}
// Entry point for executing the searchMyFan function.
export async function main(fid) {
return await searchMyFan(fid);
}
The first row serves as a header, representing the name of each column (userId, gender, phone). Each subsequent row represents a record (or data entry), containing values corresponding to each column.