|
1 | 1 | #!/bin/sh |
2 | | -# @(#) .minecraft-library.sh v1.00 (2016-09-18) / Hubert Tournier |
| 2 | +# @(#) .minecraft-library v1.10 (2016-09-30) / Hubert Tournier |
3 | 3 |
|
4 | 4 | # An API for Minecraft / Bukkit server management and scripting |
5 | 5 |
|
|
11 | 11 | # LogError() # Log an ERROR message |
12 | 12 | # LogWarning() # Log a warning message |
13 | 13 | # LogInfo() # Log an informational message |
| 14 | +# StripColors() # Filter color codes from a logfile |
| 15 | +# DisplayChat() # Displays the chat lines from a logfile |
14 | 16 | # |
15 | 17 | #-[ Minecraft commands ]-------------------------------------------------------- |
16 | 18 | # ExecuteCommand() # Execute a Minecraft command from the console |
|
49 | 51 | # AddItemToOfflinePlayerInventory # Insert an item in an offline player's inventory |
50 | 52 | # AddItemToPlayerInventory # Give an item to a player whether online or offline |
51 | 53 | # AddFileToOfflinePlayerInventory() # Insert custom item(s) from a file in an offline player's inventory |
| 54 | +# GetClientSideModsForPlayer() # Get a player's list of client side mods |
| 55 | +# GetForbiddenModsForPlayer() # Returns a comma separated list of mods, empty for a clean player |
52 | 56 | # |
53 | 57 | #-[ NBT files management ]---------------------------------------------------- |
54 | 58 | # ToggleNbtValue() # Toggle a value in an NBT file |
|
77 | 81 |
|
78 | 82 | . .server-settings |
79 | 83 |
|
| 84 | +export FORBIDDEN_MODS_LIST=${SERVER_ROOT}/config/MSL_ForbiddenMods.txt |
| 85 | +export FORBIDDEN_MODS_DETAILS=${SERVER_ROOT}/config/MSL_ForbiddenMods-full.txt |
| 86 | + |
80 | 87 | cd ${SERVER_ROOT} |
81 | 88 |
|
82 | 89 | ################################################################################################################################################################ |
@@ -131,6 +138,43 @@ LogInfo( ) |
131 | 138 | FormatLogMessage info $* >> ${DEBUG_FILE} |
132 | 139 | } |
133 | 140 |
|
| 141 | +StripColors( ) |
| 142 | +################################################################################ |
| 143 | +# DESCRIPTION: Filter color codes from a logfile |
| 144 | +# PARAMETER: - |
| 145 | +# RETURN CODE: - |
| 146 | +# DEPENDENCIES: - |
| 147 | +################################################################################ |
| 148 | +{ |
| 149 | + sed -e "s/\[m//g" -e "s/\[0;[0-9]*;[0-9]*m//g" |
| 150 | +} |
| 151 | + |
| 152 | +DisplayChat( ) |
| 153 | +################################################################################ |
| 154 | +# DESCRIPTION: Displays the chat lines from a logfile |
| 155 | +# PARAMETER: 0 (meaning latest.log) to 1 logfile name |
| 156 | +# RETURN CODE: - |
| 157 | +# DEPENDENCIES: - |
| 158 | +################################################################################ |
| 159 | +{ |
| 160 | + if [ "$#" = 0 ] |
| 161 | + then LOGFILE=${SERVER_ROOT}/logs/latest.log |
| 162 | + CMD=cat |
| 163 | + else LOGFILE=$1 |
| 164 | + FILENAME=`basename $1` |
| 165 | + case ${FILENAME} in |
| 166 | + *.log.gz) CMD=zcat ;; |
| 167 | + *.log) CMD=cat ;; |
| 168 | + esac |
| 169 | + fi |
| 170 | + |
| 171 | + ${CMD} ${LOGFILE} \ |
| 172 | + | grep "\[Netty IO #[0-9]*/INFO\]" \ |
| 173 | + | egrep -v "(Client protocol version|Client attempting to join with|Attempting connection with missing mods)" \ |
| 174 | + | sed "s/\[Netty IO #[0-9]*\/INFO\]: //" \ |
| 175 | + | StripColors |
| 176 | +} |
| 177 | + |
134 | 178 | ################################################################################################################################################################ |
135 | 179 |
|
136 | 180 | ExecuteCommand( ) |
@@ -319,7 +363,7 @@ WaitForServerStart( ) |
319 | 363 |
|
320 | 364 | sleep ${WAIT_FOR_SERVER_START} |
321 | 365 | while true |
322 | | - do RESTART_HOUR=`grep "${SERVER_STARTED_MESSAGE}" logs/latest.log | sed -e "s/^.//" -e "s/:.*//" | tail -1` |
| 366 | + do RESTART_HOUR=`grep "${SERVER_STARTED_MESSAGE}" ${SERVER_ROOT}/logs/latest.log | sed -e "s/^.//" -e "s/:.*//" | tail -1` |
323 | 367 |
|
324 | 368 | if [ "${RESTART_HOUR}" = "" -o "${RESTART_HOUR}" != "${HOUR}" ] |
325 | 369 | then sleep 1 |
@@ -574,7 +618,7 @@ RestartServerIfTooManyEntitites( ) |
574 | 618 | ExecuteCommand "mem" |
575 | 619 | ExecuteCommand "msg NonExistent ${MARKER}-end Checking entities count" |
576 | 620 | sleep 1 |
577 | | - awk "/$MARKER-begin/, /$MARKER-end/" ${SERVER_ROOT}/logs/latest.log | sed -e "s/^.*INFO\]: //" -e "s/\[.//g" -e "s/;[0-9]*;[0-9]*m//g" -e "s/,//g" | grep -v "\[Server\]" | grep -v "CONSOLE" > ${TMP}/$$.out |
| 621 | + awk "/$MARKER-begin Checking entities count/, /$MARKER-end Checking entities count/" ${SERVER_ROOT}/logs/latest.log | sed -e "s/^.*INFO\]: //" -e "s/\[.//g" -e "s/;[0-9]*;[0-9]*m//g" -e "s/,//g" | grep -v "\[Server\]" | grep -v "CONSOLE" > ${TMP}/$$.out |
578 | 622 |
|
579 | 623 | grep "entities" ${TMP}/$$.out \ |
580 | 624 | | while read LINE |
@@ -622,7 +666,7 @@ GetOnlinePlayers( ) |
622 | 666 | ExecuteCommand "msg NonExistent ${MARKER}-end Checking connected players" |
623 | 667 | sleep 1 |
624 | 668 |
|
625 | | - awk "/$MARKER-begin/, /$MARKER-end/" ${SERVER_ROOT}/logs/latest.log \ |
| 669 | + awk "/$MARKER-begin Checking connected players/, /$MARKER-end Checking connected players/" ${SERVER_ROOT}/logs/latest.log \ |
626 | 670 | | sed -e "s/^.*INFO\]: //" -e "s/\[.//g" -e "s/;[0-9]*;[0-9]*m//g" -e "s/,//g" \ |
627 | 671 | | grep -v "\[Server\]" \ |
628 | 672 | | grep -v "CONSOLE" \ |
@@ -1113,6 +1157,55 @@ AddFileToOfflinePlayerInventory( ) |
1113 | 1157 | rm -f ${TMP}/$$.err |
1114 | 1158 | } |
1115 | 1159 |
|
| 1160 | +GetClientSideModsForPlayer( ) |
| 1161 | +################################################################################ |
| 1162 | +# DESCRIPTION: Get a player's list of client side mods |
| 1163 | +# PARAMETER: Player name |
| 1164 | +# DEPENDENCIES: |
| 1165 | +# NOTES: Only tested with KCauldron |
| 1166 | +################################################################################ |
| 1167 | +{ |
| 1168 | + cat ${SERVER_ROOT}/logs/latest.log \ |
| 1169 | + | awk ' |
| 1170 | + /\[User Authenticator #[0-9]*\/INFO\]: UUID of player / { |
| 1171 | + gsub(/^.*: UUID of player /, "") |
| 1172 | + gsub(/ is /, " ") |
| 1173 | + PLAYER=$1 |
| 1174 | + } |
| 1175 | + /\[Netty IO #[0-9]*\/INFO\]: Client attempting to join with/ { |
| 1176 | + gsub(/^.*: Client attempting to join with [0-9]* mods : /, "") |
| 1177 | + gsub(/ /, "_") |
| 1178 | + MODS=$0 |
| 1179 | + printf "%s:%s\n", PLAYER, MODS |
| 1180 | + } |
| 1181 | + ' \ |
| 1182 | + | grep "^${PLAYER}:" \ |
| 1183 | + | cut -d":" -f2 \ |
| 1184 | + | tail -1 |
| 1185 | +} |
| 1186 | + |
| 1187 | +GetForbiddenModsForPlayer( ) |
| 1188 | +################################################################################ |
| 1189 | +# DESCRIPTION: Returns a comma separated list of mods, empty for a clean player |
| 1190 | +# PARAMETER: Player name |
| 1191 | +# DEPENDENCIES: |
| 1192 | +# NOTES: Only tested with KCauldron |
| 1193 | +################################################################################ |
| 1194 | +{ |
| 1195 | + { |
| 1196 | + GetClientSideModsForPlayer ${1} \ |
| 1197 | + | tr ',' '\n' \ |
| 1198 | + | sed "s/@.*//" |
| 1199 | + |
| 1200 | + [ -f ${FORBIDDEN_MODS_LIST} ] \ |
| 1201 | + && cat ${FORBIDDEN_MODS_LIST} |
| 1202 | + } \ |
| 1203 | + | sort \ |
| 1204 | + | uniq -d \ |
| 1205 | + | tr '\n' ',' \ |
| 1206 | + | sed "s/,$//" |
| 1207 | +} |
| 1208 | + |
1116 | 1209 | ################################################################################################################################################################ |
1117 | 1210 |
|
1118 | 1211 | ToggleNbtValue( ) |
@@ -1164,7 +1257,7 @@ ToggleNbtValue( ) |
1164 | 1257 | fi |
1165 | 1258 | fi |
1166 | 1259 | rm -f $${TMP}/$$.dat ${TMP}/$$.err |
1167 | | - else |
| 1260 | + else return 1 |
1168 | 1261 | fi |
1169 | 1262 | else return 1 |
1170 | 1263 | fi |
|
0 commit comments