Community Hub Feature (SERVER) #53

Open
opened 2026-01-04 07:00:37 +00:00 by defnotken · 1 comment
Owner

As a user, I want to create a posting that advertises my event and/or syncshell across accessible data centers (ie. Light <-> Chaos <-> Materia):

Requirements

Posting

  • Postings should only appear based on user's accessible data centres? ie. (send data based on data centre so plugin does less processing in game)

  • Moderators/Devs of Lightless can take action on postings. (Delete Postings)

  • Enable Temporary Syncshells: Have a task that runs through and deletes temporary syncshells

  • Model should be something like this:

public class Posting
{
    [Key]
    public Guid Guid { get; set; }

    public DateTimeOffset StartTime { get; set; } 

    public DateTimeOffset EndTime { get; set; } // should have an end time (maybe Max 24 hours?)

    public DateTimeOffset LastUpdate { get; set; }

    [MaxLength(128)]
    public string Title { get; set; }

    [MaxLength(1024)]
    public string Description { get; set; }

    public int [] Tags { get; set; } // Our tags are int []

    public bool IsNSFW { get; set; }

    public bool Open { get; set; }

    public bool HasTempGroup { get; set; } // Q for zura

    public string? TempGroupPW { get; set; } // Q for zura

    public User User { get; set; }
    [MaxLength(20)]
    public string? UserId { get; set; }

    public Group Group { get; set; }
    [MaxLength(20)]
    public string? GroupId { get; set; }

    // Future Work
    public Location location {get; set;}
}

Location (needs refinement):

Location can be done in multiple ways, we should make it usable with Lifestream

Location:
    LocationType: HOUSING, AETHERYTE, CUSTOM / req
    World: Int // req
    // if AETHERYTE TYPE
    AetheryteId: int // opt (for Aetheryte) should cover city as well ...need more research for that
    // if HOUSING TYPE
    City: int // derived from ResidentialAetheryteKind
    Ward: int 
    PropertyType: int // 0 House, 1 Apartment
    Plot: int // default 0
    Apartment: int // default 0
    ApartmentSubdivision: bool // default false
    CustomString: string // ie. twintania, tp limsa || twintania w29 p7

Lifestream

We have the ability to do the following

  1. Command Processing: as simple as sending "twintania shiro w29 p7"

  2. Sending a Housing Tuple (if House):
    AddressBookEntryTuple addressEntry = (
    Name: "",
    World: (int)twintania.Key,
    City: (int)ResidentialAetheryteKind.Kugane,
    Ward: ward,
    PropertyType: 0,
    Plot: plot,
    Apartment: 1,
    ApartmentSubdivision: false,
    AliasEnabled: false,
    Alias: ""
    );

  3. Teleport by Aetheryte ID (Requires testing)

  • IDEA: Possibly display a dictionary of popular locations with their Aetheryte Ids attached (ie <Costa Del Sol, ##>, <Limsa, ##>)

We also have the ability to change instances if applicable.

As a user, I want to create a posting that advertises my event and/or syncshell across accessible data centers (ie. Light <-> Chaos <-> Materia): # Requirements ## Posting - Postings should only appear based on user's accessible data centres? ie. (send data based on data centre so plugin does less processing in game) - Moderators/Devs of Lightless can take action on postings. (Delete Postings) - Enable Temporary Syncshells: Have a task that runs through and deletes temporary syncshells - Model should be something like this: ``` public class Posting { [Key] public Guid Guid { get; set; } public DateTimeOffset StartTime { get; set; } public DateTimeOffset EndTime { get; set; } // should have an end time (maybe Max 24 hours?) public DateTimeOffset LastUpdate { get; set; } [MaxLength(128)] public string Title { get; set; } [MaxLength(1024)] public string Description { get; set; } public int [] Tags { get; set; } // Our tags are int [] public bool IsNSFW { get; set; } public bool Open { get; set; } public bool HasTempGroup { get; set; } // Q for zura public string? TempGroupPW { get; set; } // Q for zura public User User { get; set; } [MaxLength(20)] public string? UserId { get; set; } public Group Group { get; set; } [MaxLength(20)] public string? GroupId { get; set; } // Future Work public Location location {get; set;} } ``` ## Location (needs refinement): Location can be done in multiple ways, we should make it usable with Lifestream ``` Location: LocationType: HOUSING, AETHERYTE, CUSTOM / req World: Int // req // if AETHERYTE TYPE AetheryteId: int // opt (for Aetheryte) should cover city as well ...need more research for that // if HOUSING TYPE City: int // derived from ResidentialAetheryteKind Ward: int PropertyType: int // 0 House, 1 Apartment Plot: int // default 0 Apartment: int // default 0 ApartmentSubdivision: bool // default false CustomString: string // ie. twintania, tp limsa || twintania w29 p7 ``` # Lifestream We have the ability to do the following 1. Command Processing: as simple as sending "twintania shiro w29 p7" 2. Sending a Housing Tuple (if House): AddressBookEntryTuple addressEntry = ( Name: "", World: (int)twintania.Key, City: (int)ResidentialAetheryteKind.Kugane, Ward: ward, PropertyType: 0, Plot: plot, Apartment: 1, ApartmentSubdivision: false, AliasEnabled: false, Alias: "" ); 3. Teleport by Aetheryte ID (Requires testing) - IDEA: Possibly display a dictionary of popular locations with their Aetheryte Ids attached (ie <Costa Del Sol, ##>, <Limsa, ##>) We also have the ability to change instances if applicable.
defnotken changed title from Community Hub Feature to Community Hub Feature (SERVER) 2026-01-04 07:01:04 +00:00
Member

Location maybe something like:

public class Location
{
    enum LocationType
    {
        House,
        Aetheryte,
        Custom,
    }
    
    [Key]
    Guid Guid { get; set; }
    LocationType Type { get; set; }
    
    uint ServerId { get; set; }
    uint TerritoryId  { get; set; }
    uint MapId { get; set; } //Dont use this if Inhouse
    public uint Division { get; set; } = 0;
    
    //House
    public uint PlotId { get; set; } = 0;
    public uint HouseId { get; set; } = 0; //if Apartment = 100 <- LocationInfo
    public uint RoomId { get; set; } = 0;
    public bool IsSubDivision { get; set; } = false;
    
    //Aetheryte
    public uint AetheryteId { get; set; } = 0;
    
    //Custom
    string CustomCommand { get; set; }
    
}

Can use DalamudUtil.GetMapData() to easily make one for House type.

Location maybe something like: ``` public class Location { enum LocationType { House, Aetheryte, Custom, } [Key] Guid Guid { get; set; } LocationType Type { get; set; } uint ServerId { get; set; } uint TerritoryId { get; set; } uint MapId { get; set; } //Dont use this if Inhouse public uint Division { get; set; } = 0; //House public uint PlotId { get; set; } = 0; public uint HouseId { get; set; } = 0; //if Apartment = 100 <- LocationInfo public uint RoomId { get; set; } = 0; public bool IsSubDivision { get; set; } = false; //Aetheryte public uint AetheryteId { get; set; } = 0; //Custom string CustomCommand { get; set; } } ``` Can use DalamudUtil.GetMapData() to easily make one for House type.
Sign in to join this conversation.
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Lightless-Sync/LightlessServer#53