Free scripts
Poggy Tickets
Players ask for help, staff claim it. A ticket window for players, a large staff panel with your own staff roles, staff chat, warn, kick and ban, Discord posts, and an optional website for tickets and ban appeals.
Overview#
Poggy Tickets gives players one place to ask for help, and gives your staff one panel to handle it. A player presses a key or types /ticket, picks what it is about and says what happened. The ticket goes to the staff who handle that kind of ticket. One of them claims it, answers in a chat with the player, or teleports to them with one press.
Staff roles are yours. A new server starts with Admin, Mod, Helper and Developer, but you can rename them, change what each may do, or make your own. Warn, kick and ban work from a ticket or with no ticket at all, and bans are poggy_core's account bans.
- Ticket window for players: two big buttons, I need help right now and Send a ticket, plus My tickets and Solved questions.
- Help requests: one press, no form, calls staff to where the player is.
- Staff panel: live ticket ages, online and offline players, filters, claim, assign, escalate, internal notes, ready-made replies, one-press teleports.
- Players menu (
/mod): everyone online with their record, and Warn, Kick and Ban. - Staff chat: a room per role, plus rooms you make. Never saved.
- Solved questions: staff can share a solved ticket with every player, names hidden.
- Audit trail: everything staff did, grouped by day.
- Discord: one post per ticket, edited as the ticket moves, never deleted.
- Website (off by default): players and staff use tickets in a browser at poggy.app/tickets, and banned players can appeal at poggy.app/appeal.
Requirements#
- A RedM server running VORP Core, RSG Core or QBCore RedM.
- poggy_core 0.19.0 or newer. For the screens to follow the Poggy theme you choose in
/poggy, use poggy_core 0.23.0 or newer; with an older one they keep their own look. - oxmysql.
- OneSync, for Go to player.
Installation#
- Download Poggy Tickets and put the
poggy_ticketsfolder in your resources folder. - Add it to
server.cfg, after poggy_core and oxmysql:ensure oxmysql ensure poggy_core ensure poggy_tickets - Start the server. The database tables are made for you; there is nothing to import.
- In game, type
/ticketsand add your staff on the Staff tab. Anyone your framework counts as an admin can already do this. - Optional: paste a Discord webhook in
/poggy→ Tickets → Discord, then restart the script.
Configuration#
Every setting is in config.lua, with a comment on each, and in game in /poggy → Tickets. Most changes apply at once; command names, the web panel settings and the Discord webhook need a restart of the script.
Opening and keys
| Setting | Default | What it does |
|---|---|---|
Config.Command | "ticket" | The command players type to open the ticket form. |
Config.OpenKey | Page Up | The key that opens the ticket form. 0 turns it off; the command always works. |
Config.StaffCommand | "tickets" | The command that opens the staff panel. |
Config.StaffKey | Home | The key that opens the staff panel, for staff only. 0 turns it off. |
Config.ModCommand | "mod" | The command that opens the Players menu. |
Config.InvisCommand | "invis" | The command staff use to turn invisibility on or off. |
Config.DutyCommand | "staffduty" | The command staff use to go off duty or back on. |
Config.Language | "en" | The language of every message and window. Add one by copying the en block in translations.lua. |
Players cannot rebind the two keys themselves, so pick keys nothing else on your server uses. In /poggy you pick them from a key list.
The ticket form
| Setting | Default | What it does |
|---|---|---|
Config.PlayerList | "nearby" | Who a player can pick when reporting someone: nearby (players close by, with names), all (everyone online, with names) or ids (everyone online, server ids only). Nearby is the safest on a roleplay server. |
Config.NearbyRadius | 100 | How close, in metres, a player must be to show in the nearby list. |
Config.TicketCooldownMinutes | 15 | Minutes between tickets from one player. 0 is no wait. |
Config.MaxOpenTickets | 2 | Open tickets one player may have at once. |
Config.TellWhenNoStaff | true | Tell the player when no on-duty staff handle their kind of ticket. The ticket is saved either way. |
Config.ShowExpectedWait | true | Show how long that kind of ticket usually waits, worked out from your own tickets. |
Config.HelpCooldownMinutes | 5 | Minutes between help requests from one player. |
Config.HelpExpireMinutes | 10 | Minutes before a help request nobody marked done disappears. |
Config.NudgeAfterHours | 24 | Hours after staff last wrote, with no answer, before the player is asked "still need help?". 0 turns it off. A player waiting on staff is never asked. |
Config.AutoCloseAfterHours | 48 | Hours after that question, still with no answer, before the ticket closes itself as No response. 0 never closes one for you. |
Kinds of ticket
Config.Categories lists the kinds players pick from. Six ship with the script: Bug, Cheater, Player report, Help, Stuck or lost items, Other. Each kind has an id, a label, a starting priority (urgent, high, medium or low), reportsPlayer (the form asks which player, and staff get Warn, Kick and Ban on it) and wantsClip (the form asks for a video link, never required). Edit them in /poggy → Tickets → Kinds & routing.
Never change a kind's id once tickets of that kind exist. When you add a new kind, tick it on the roles that should see it, or only admins will.
Config.Routing and Config.HelpRoles are old settings. They are copied into the roles once, the first time 1.1.0 starts, so a server updating from 1.0 keeps its routing. After that, changing them does nothing: each role says what it sees.
Solved questions
| Setting | Default | What it does |
|---|---|---|
Config.PublicAnswers | true | Staff can mark the answer in a ticket and, once it is closed, share it with every player, names hidden. false removes the feature. |
Config.SuggestAnswers | true | While a player types, show up to three shared answers that look like their problem. |
Config.PublicKinds | bug, help, stuck, other | The kinds that may be shared. A kind that names a player can never be shared, whatever is listed. |
Staff and moderation
| Setting | Default | What it does |
|---|---|---|
Config.StaleClaimMinutes | 15 | Minutes a claimed ticket waits for a staff member who logged off before anyone else can claim it. |
Config.ShowBadge | true | A small count of waiting tickets on screen for on-duty staff. |
Config.StaffFullscreen | false | Whether the panel starts full screen. Each staff member can switch it. |
Config.ChatPopups | true | A pop-up for a new staff chat message. |
Config.WarningDecayDays | 90 | Days before a warning stops counting toward the ladder. It stays on the record. 0 means warnings always count. |
Config.Ladder | warn, warn, kick, ban:1d, ban:7d, ban:perm | What to suggest for a player's 1st, 2nd, 3rd offence and so on. Only a suggestion on the record; staff decide. An empty list turns it off. |
Config.Teleport.Invisible | true | Staff who teleport from a ticket arrive invisible and unable to be hurt, until they press Return or use /invis. |
Config.Teleport.Behind | 3.0 | Metres behind the player staff arrive. |
Config.SoundVolume | 0.4 | Notification sound, from 0.0 (silent) to 1.0. |
Config.PurgeClosedAfterDays | 0 | Days a closed ticket is kept. 0 keeps them forever. Old ones are removed when the script starts. |
Discord
| Setting | Default | What it does |
|---|---|---|
Config.Discord.Webhook | not set | Your channel's webhook address. Each ticket is one post: red when open, amber when claimed, green when closed. Player text can never ping anyone. |
Config.Discord.Name | "Tickets" | The name the posts are made under. |
Config.Discord.CategoryWebhooks | empty | A different channel for one kind of ticket, for example ["bug"] = "https://discord.com/api/webhooks/...". Kinds not listed use the main webhook. |
To get a webhook: in Discord, channel settings → Integrations → Webhooks → New webhook → Copy URL.
The website (off by default)
| Setting | Default | What it does |
|---|---|---|
Config.Web.Enabled | false | Turns on tickets in a browser at poggy.app/tickets. Read the website section first. |
Config.Web.Api | the relay's address | Where the relay is. Do not change it. |
Config.Web.Appeals | false | Banned players can appeal to you at poggy.app/appeal. This lists your community by name on that page. |
Config.Web.PublicName | empty | The name players see when picking who to appeal to. Empty uses your server's name. |
Config.Web.AppealNote | empty | One line shown above your appeal box, for example your rules on appeals. |
Config.Web.Moderation | false | Lets staff warn, kick and ban from the website, on the player a ticket reports. |
Config.Web.VerifyDevices | true | Each browser must be confirmed once with a link code from the game before it opens the staff desk. |
Config.Web.LinkDays | 30 | Staff only: days someone keeps the staff desk on the website after their last login on your server. |
Commands#
| Command | Who | What it does |
|---|---|---|
/ticket or Page Up | Everyone | Opens the ticket form: send a ticket, call for help, read and answer your own tickets, read solved questions, and the Website tab. |
/tickets or Home | Staff (anyone with a ticket role) | Opens the staff panel. |
/mod [server id] | Staff whose role may warn, kick or ban | Opens the Players menu: everyone online with their record, and Warn, Kick and Ban. No ticket needed. /mod 12 opens it on player 12. |
/invis | Staff | Turns your invisibility on or off. You cannot be hurt while invisible. It never survives a relog, and every use is in the audit trail. |
/staffduty | Staff | Off duty, or back on. Off duty means no sounds, pop-ups or badge, and you do not count as staff online. You are always back on duty after a relog. |
Every command name and both keys can be changed in config.lua or in /poggy → Tickets → Opening & keys.
Bans can also be handled from the server console with poggy_core's commands: poggycore ban, poggycore unban and poggycore baninfo. See poggy_core.
Permissions#
Who is staff
Staff are the people you give a ticket role, on the panel's Staff tab. Search any character name, online or not, tick their roles and press Save. A role is on the account, so it covers every character that person plays, and one person can hold several roles. Anyone your framework counts as an admin is an Admin here without being added.
Roles are yours
Edit roles in the staff panel (Staff → Roles) or in /poggy → Tickets → Roles, chat & replies. Changes apply at once, with no restart. For each role you choose:
- Name, colour and rank (rank only orders lists).
- What it may do, from 18 powers: claim, reply, close, go to a player, change kind, change priority, give a ticket to someone, escalate, mark the answer, warn, kick, ban, lift bans, staff notes, archive, add staff, read the audit trail, manage roles.
- Which kinds of ticket it sees.
- Whose staff chat it reads, besides its own.
- Whether it is told about help requests.
- An optional Discord webhook that copies the role's staff chat.
A new server starts with these four:
| Role | Sees | Can |
|---|---|---|
| Admin | everything | everything |
| Mod | Cheater, Player report, Help, Stuck, Other | claim, reply, close, teleport, change kind and priority, assign, escalate, mark the answer, warn, kick, staff notes |
| Helper | Help, Stuck | claim, reply, close, teleport, change kind and priority, escalate |
| Developer | Bug, Other | claim, reply, close, teleport, change kind and priority, escalate, mark the answer |
Only Admin can ban, lift bans, archive, add staff, read the audit trail and manage roles until you give those powers to another role.
Admin is locked. It always holds every power, sees every ticket and reads every room, and it cannot be deleted, so nobody can lock the team out. Its name, colour and webhook are still yours to change. Deleting any other role takes it off everyone who held it.
Deleting a ticket for good
Archive is a role power: the ticket leaves every list but the Archived filter, nothing is destroyed, and Bring back undoes it. Delete is not a role power. Only the server owner can allow it, in server.cfg, and only a ticket that is already archived can be deleted:
add_ace identifier.steam:110000112345678 poggy_tickets.delete allow
Use that person's own identifier, or a group such as group.owner. The audit trail keeps one line saying who deleted which ticket and when; what the ticket said is gone.
Using it in game#
For players
- Press Page Up or type
/ticket. - Pick I need help right now to call staff to you with no form (for being stuck, downed or lost), or Send a ticket.
- On the form: pick what it is about and how urgent, and say what happened. For a report, pick the player from the list and add a video link if you have one. Leave I would like a staff member to come to me on if you want a visit.
- Send. Your position is saved with the ticket. If no staff are on, you are told, and the ticket is still saved.
- A pop-up at the bottom right, with a sound, tells you when staff take, answer or close your ticket. Read and reply under My tickets.
While a player types, the form may show answers to similar questions from Solved questions, so a question already answered never becomes a ticket.
For staff
- The list shows each ticket's age live, green names for online players and grey rows for offline ones, and a coloured edge for urgent and high priority. Filter by status, kind and priority, or search. Red bubbles count what is still waiting.
- Claim a ticket to make it yours, Assign it to someone else, or Escalate to bring another role in while you stay the owner.
- Go to player or Go to location takes you there in one press, a few metres behind and invisible. Return takes you back and makes you visible.
- Reply in the Conversation box. Flip the switch for an internal note (dark red): it is removed on the server before anything is sent to the player.
- Ready-made replies sit above the reply box, best match first. Eight ship with the script; change them under Staff → Ready-made replies.
{player},{staff}and{id}are filled in. - Mark as the answer pins a message in green for staff and player. On a closed ticket with an answer, Make public shares it in Solved questions with names hidden. Check nobody is named inside a message first.
- Close ticket asks why; the note is read by the player.
Warn, kick and ban
Open the Players menu with /mod, the panel's Players tab, or /poggy → Tickets → Players: warn, kick, ban. Pick a player to see their record (warnings, bans, tickets), then Go to, Warn, Kick or Ban. Every action needs a reason, and the player is never told who reported them. Someone who already left can be found by typing their name and pressing Enter.
- A warning is full screen and must be acknowledged; one left for an offline player shows when they log in.
- A ban is on the account, so it follows the player across characters. Tick "This is for cheating" when it is.
- The record shows what the ladder suggests next, which old warnings no longer count, staff notes the player never sees, and a watch flag that tells staff when that player logs in.
Bans belong to poggy_core, not this script: they are reversible and keep working even when Poggy Tickets is stopped. Lift one on the panel's Bans tab (it needs a reason and keeps the record) or with poggycore unban in the console.
Staff chat
The Staff chat tab has a room per role, plus any rooms you make with New room. With the starting roles, admins read every room, mods read Mod and Helper, helpers read Helper, and developers have their own. Messages are never saved: they live in memory and are gone at the next restart. Give a room a Discord webhook if you want a record.
Audit trail
The Audit tab lists everything staff did, grouped by day. Filter by area (Tickets, Moderation, Movement, Staff), by person, or click a ticket number to see only that ticket.
Tickets on the website
The website is off by default. When on, people sign in at poggy.app/tickets with their Cfx.re account and type your community ID.
Read this before you turn it on. Your server cannot talk to a website directly, so both talk to a relay run by Poggy. Copies of your open tickets (names, what players wrote, the conversations, internal notes) are kept there while a ticket is open and for 7 days after it closes. For each person who uses the website it also keeps their Cfx.re account id, name and character names. Archive or delete a ticket and its copy is taken back. Turn the website off and the relay forgets your community at once; stop syncing for a month and it forgets you by itself. If that is not right for your community, leave it off: nothing else needs it.
/poggy→ Tickets → Web panel → switch it on (or setConfig.Web.Enabled = true), then restart the script.- Your community ID is made for you. It looks like
ABCD-EFGH. Everyone sees it in game at the top of/ticketand/ticketsand on their Website tab, so there is nothing to hand out. It is not a secret: on its own it opens nothing. - People link their account once. If their game is signed in to Cfx.re, they are linked by themselves the moment they log in, and the Website tab says so. Otherwise, or if they use a different Cfx.re account on the website, they press Get my link code on the Website tab of
/ticket(or/tickets) and type the code at poggy.app/tickets. A code is six letters and numbers, works once, and lasts ten minutes. It must never be given to anyone else. Anyone can unlink on the same tab.
What players see: their own tickets, open and closed in the last 7 days, with a chip per character. They can answer and write a new ticket as one of their characters, with the same cooldown and limit as in game. They never see internal notes or anyone else's ticket. A banned player is sent to the appeal page instead.
What staff see: a second tab, the staff desk, for as long as their account holds a ticket role: read, reply, internal notes, claim, release, close. Take the role away in game and the desk is gone at the next sync. A staff link runs out after Config.Web.LinkDays (30) days without a login on your server. Every web action is checked against that person's role on your server, and shows in the audit trail as Name (web).
Confirm each browser (Config.Web.VerifyDevices, on by default): a Cfx.re sign-in alone does not open the staff desk. The first time in a new browser the page asks for a link code from /tickets → Website, so a stolen Cfx.re login is useless without also being in your game. Sign out my browsers on the same tab takes the staff desk away from every browser until each is confirmed again. Players' own tickets never ask for this.
Warn, kick and ban from the website (Config.Web.Moderation, off by default): when on, staff get those three buttons on a ticket that reports a player, if their role has the power in game. A reason is always asked for, and your server checks each one again. A ban from the website is always a local ban: bans for poggy_core's shared ban network are made in game. Keep Confirm each browser on if you use this.
Ban appeals
Switch on Config.Web.Appeals (it needs the website on). Your community is then listed by name at poggy.app/appeal. A banned player signs in with Cfx.re, picks you and writes their appeal. It arrives as a ticket of the kind Ban appeal, seen by every role that may lift bans with nothing to set up. Click the player's name to see their record, reply in the ticket, and they read and answer on the website. One open appeal per player at a time. To lift the ban, use the Bans tab or poggycore unban.
For developers#
Poggy Tickets has no public exports or events for other scripts. Bans are poggy_core's, so another script that needs to ban or check a ban goes through poggy_core; see poggy_core.
Tables, all made and kept up to date by poggy_core when the script starts: poggy_tickets, poggy_ticket_staff, poggy_ticket_roles, poggy_ticket_warnings, poggy_ticket_audit, poggy_ticket_help, poggy_ticket_chats, poggy_ticket_canned, poggy_ticket_notes, poggy_ticket_watch, and for the website poggy_ticket_web, poggy_ticket_weblinks, poggy_ticket_webchars. Edit roles and replies in the panel or /poggy, not in the database.
Troubleshooting#
A staff member cannot open the panel
They need a ticket role. Add them on the panel's Staff tab, or check that your framework counts them as an admin. If they hold a role but see no tickets, tick the right kinds on that role.
Staff do not see tickets of a new kind
Each role only sees the kinds ticked on it. After adding a kind, tick it on the roles that should see it: Staff → Roles → Edit.
I changed Config.Routing or Config.HelpRoles and nothing happened
Those are old settings, read once when 1.1.0 first started. Change who sees what, and who hears help requests, on each role.
The key does nothing
Another resource may use the same key. Pick a different one in /poggy → Tickets → Opening & keys, or use the command. The staff key was Page Down before 1.1.0 and is Home now, because vorp_admin uses Page Down.
Delete is greyed out or refused
Delete needs the poggy_tickets.delete permission in server.cfg, and the ticket must be archived first.
Go to player does not work
Teleporting to a player needs OneSync on the server.
Discord posts do not appear
Check the webhook address in /poggy → Tickets → Discord, then restart the script.
Staff chat messages are gone
That is on purpose: staff chat is never saved and is cleared at every restart. Give a room a Discord webhook if you need a record.
The website says I am not linked
Get a link code from the Website tab of /ticket and type it at poggy.app/tickets within ten minutes. Staff on a new browser need a code from /tickets → Website to open the staff desk.
Updating#
poggy_core's updater installs new versions and keeps your config.lua and translations.lua values: see Updates in poggy_core.
- From 1.0: the first start of 1.1.0 or newer copies your
Config.RoutingandConfig.HelpRolesinto the roles once. After that, the roles are what count. The default staff panel key is Home since 1.1.0 (it was Page Down, which vorp_admin also uses); an update keeps the key you already had, so change it in/poggyif it clashes. - The screens follow poggy_core's theme from poggy_core 0.23.0; update poggy_core too if they still look the old way.