Difference between revisions of "User:Nosoop/Guide/How to X"
(Add section on Unicode handling) |
(→Proper Unicode handling in MySQL: Add note on converting existing data) |
||
Line 45: | Line 45: | ||
= Proper Unicode handling in MySQL = | = Proper Unicode handling in MySQL = | ||
− | MySQL defaults to using the latin1 character encoding, which isn't good if you need to store non-ASCII text. | + | MySQL defaults to using the <tt>latin1</tt> character encoding, which isn't good if you need to store non-ASCII text. |
* Ensure columns are created with the <tt>utf8mb4</tt> collation, ''not'' <tt>utf8</tt> (which aliases to <tt>utf8mb3</tt>). | * Ensure columns are created with the <tt>utf8mb4</tt> collation, ''not'' <tt>utf8</tt> (which aliases to <tt>utf8mb3</tt>). | ||
* After connecting to the database, call {{SourceMod API|file=dbi|class=Database|function=SetCharset}} with <tt>utf8</tt>. | * After connecting to the database, call {{SourceMod API|file=dbi|class=Database|function=SetCharset}} with <tt>utf8</tt>. | ||
+ | |||
+ | If you have previous entries that were encoded as <tt>latin1</tt>, refer to [https://stackoverflow.com/a/9407998 this StackOverflow answer] to convert it. Do note that the outermost <code>convert</code> operation should use <tt>utf8mb4</tt> instead. |
Latest revision as of 10:53, 4 March 2023
This is a page on how to do things that are common in plugins. These are intended to be best practices.
Contents
Determine if a client has access to something
Use the admin overrides system with the CheckCommandAccess
function.
For example, if you want to determine if a client has access to the sm_ban
command:
if (CheckCommandAccess(client, "sm_ban", ADMFLAG_BAN)) { // client has access to the "sm_ban" command }
The command
parameter can be an arbitrary string; it does not have to point to a valid command:
if (CheckCommandAccess(client, "has_fancy_color_trails", ADMFLAG_CUSTOM1, true)) { // client has access to the "has_fancy_color_trails" override; // if an override entry isn't set it falls back to ADMFLAG_CUSTOM1. // ignores the privileges set on a command of that name if it exists }
Under no circumstance should you leave the command
parameter blank; even if you want to check access based on existing admin flags, you should provide a unique "command" string to allow server operators to override access themselves.
To assign access levels for specific strings, modify configs/admin_overrides.cfg.
For more detailed information, see this page on overriding command access.
Declare methodmap natives
Methodmap natives are the same as any other native, except that the this
value is passed in as the first parameter, and any additional parameters follow it.
Pass enum structs through natives
In short, you don't. Enum structs do not (at the time of writing) have a standardized in-memory representation, so they should not be passed across plugin boundaries. There's also no way to guarantee that two plugins were compiled with the same definition, let alone implementation (though checking the offset / sizes of each member would lower the risk).
The safest approach is to serialize / deserialize the data through a standard container (StringMap
, DataPack
). That is then exposed to other plugins as an opaque handle (the methodmap definition would inherit from Handle, and read / write operations are handled indirectly through natives registered by the originating plugin).
Add linebreaks in CS:GO chat messages
CS:GO uses the newline character \n
as a text color. Use the paragraph separator character instead: \xE2\x80\xA9
Proper Unicode handling in MySQL
MySQL defaults to using the latin1 character encoding, which isn't good if you need to store non-ASCII text.
- Ensure columns are created with the utf8mb4 collation, not utf8 (which aliases to utf8mb3).
- After connecting to the database, call
Database.SetCharset
with utf8.
If you have previous entries that were encoded as latin1, refer to this StackOverflow answer to convert it. Do note that the outermost convert
operation should use utf8mb4 instead.