Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

История благодарностей участнику Inline ::: Спасибо сказали: 80
Дата поста: В теме: За сообщение: Спасибо сказали:
16.4.2019, 19:42 -- Rest In Pawn (gRIP)
Цитата(jtiq @ 15.4.2019, 23:49) *
Inline, long-polling поддерживает этот модуль?

https://github.com/In-line/grip/blob/32e11d...g/grip.inc#L283
esterio
16.4.2019, 19:35 -- Rest In Pawn (gRIP)
Цитата(Affl @ 15.4.2019, 22:41) *
Могу ли я, как человек несведующий, узнать, в каком случае (примеры ситуаций) может понадобиться этот модуль? Вдруг он может мне пригодиться, допустим, в работе с тяжелой БД от вар3мода?

https://ru.wikipedia.org/wiki/REST
esterio
15.4.2019, 18:18 -- Rest In Pawn (gRIP)
Цитата(Metal Messiah @ 15.4.2019, 17:59) *
Это все хорошо, респект и уважуха, но все это сильно напоминает попытку к луку прикрутить подствольный гранатомет. Полезут сейчас все скриптеры писать сохранение данных в Google Drive, или что там на REST построено.
Асинхронен в каком плане? HTTP запрос отправляется, а ответ ожидается в отдельном потоке, без фризов? Тогда дело хорошее.
Но UDP все равно лучше :)


Ну, пусть пишут, от этого только польза. Для удобства и быстроты можно добавить прогресс запроса и возможность сразу же асинхронно читать и записывать файл.

Асинхронен в каком плане этот вопрос я не понимаю. Тут написана деталь реализации "HTTP запрос отправляется, а ответ ожидается в отдельном потоке, без фризов?". Кратко отвечу. Нет каких либо операций, которые блокируют главный поток на длительное время. Единственное, что возможно будет блокировать так это парсинг JSON-а. Но он работает сейчас ~200-300МБ/сек, так что я не думал что есть смысл делать это тоже асинхронным.

А как реализован gRIP, то это отдельная тема. В отличие от других похожих реализаций тут нет пула потоков, а есть 1 главный поток который работает на асинхронных библиотеках. Если интересно в деталях как это работает погуглите "hyper Rust" или "futures Rust", но если кратко и просто, то на основе этой библиотеки можно работать удобно работать неблокирующими сокетами, которые хорошо масштабируются даже на 1-ом потоке. Но в любом случае об этом всё-таки лучше расскажет несколько часовой доклад, чем эти несколько строк.
esterio, jtiq, oxoTHuk.
15.4.2019, 15:39 -- Rest In Pawn (gRIP)
Цитата(jtiq @ 15.4.2019, 12:38) *
Inline, это полностью асинхронный код? как передать данные методом post?


Да. Думаю если я скину данный фрагмент из инклуда то будет ясно как.

Код:


enum GripRequestType {
GripRequestTypeGet = 0,
GripRequestTypePost = 1,
GripRequestTypePut = 2,
GripRequestTypeDelete = 3
}
esterio, jtiq
14.4.2019, 11:03 -- Rest In Pawn (gRIP)
SISA компилятора под рукой нет, но должно работать.
Код:
#include <amxmodx>
#include <grip>

public plugin_init() {
makeRequest();
}

makeRequest() {
new GripBody:body = grip_body_from_string("{^"title^": ^"foo^", ^"body^": ^"bar^", ^"userId^": 1}");
new GripRequestOptions:options = grip_create_default_options();
grip_options_add_header(options, "Content-Type", "application/json");
grip_options_add_header(options, "User-Agent", "Grip");

grip_request("http://jsonplaceholder.typicode.com/posts", body, GripRequestTypePost, "HandleRequest", options);
grip_destroy_body(body);
grip_destroy_options(options);
}

public HandleRequest() {
if(grip_get_response_state() != GripResponseStateSuccessful) {
server_print("Not successful. State is %d", grip_get_response_state());
return;
}
new response[1024];
grip_get_response_body_string(response, charsmax(response));
server_print("Response status code is %d, and response is %s", grip_get_response_status_code(), response);
}
esterio, oxoTHuk.
13.4.2019, 22:06 -- Rest In Pawn (gRIP)
Цитата(SISA @ 13.4.2019, 21:49) *
2Inline

Очень интересно. Какие отличие от Curl (плюсы-минусы) ?

Вы про этот модуль https://github.com/Polarhigh/AmxxCurl ?
Ну на моём модуле хотя бы сложно получить падения из неоткуда и API значительно проще. А про производительность молчу, модуль построен вокруг библиотеки reqwest, которая из под коробки держит пул соединений, резолвит DNS асинхронно и многое другое о чём я не знаю.
Кроме того можно парсить JSON-ы больше 4096 символов, так как не нужно передавать строку туда сюда. В AMXX есть ограничение что строка может быть в некоторых местах максимум длиной в 4096 символов, поэтому с AmxxCurl не получится работать с хоть как-то большими данными)

А минусы, я не знаю. Может в некоторых местах чего-то не хватает, делаю по желанию пользователей.
esterio, SISA
13.4.2019, 21:47 -- Rest In Pawn (gRIP)
-- Rest In Pawn (gRIP)
Представляет REST API для AMX Mod X скриптеров. Позволяет совершать https/http запросы асинхронно

Совместимость
- Требуется AMX Mod X 1.8.3+
- Работает как на HLDS так и на ReHLDS
- Linux (возможно появится в будущем поддержка Windows)

Особенности:
- Написан с расчетом на высокую производительность и стабильность сервера
- Полностью асинхронен
- Имеет встроенную поддержку JSON

Инклуд на момент публикации.
Код:
/*
* gRIP
* Copyright © 2018 Alik Aslanyan <cplusplus256@gmail.com>
* Copyright © The AMX Mod X Development Team.
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 3 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/

/*
* Some of the API definitions were taken from AMX Mod X. There are places, where I decided to do somethings differently.
* Btw JSON implementation is designed to be 90% drop in replacement of AMX Mod X json.inc file.
*/

#if defined _grip_included
#endinput
#endif
#define _grip_included

#pragma reqlib grip
#if !defined AMXMODX_NOAUTOLOAD
#pragma loadlib grip
#endif


enum GripRequestType {
GripRequestTypeGet = 0,
GripRequestTypePost = 1,
GripRequestTypePut = 2,
GripRequestTypeDelete = 3
}

enum GripRequestCancellation {
Invalid_GripRequestCancellation = 0,
}

enum GripRequestOptions {
Empty_GripRequestOptions = -1,
Invalid_GripRequestOptions = 0,
}

enum GripBody {
Empty_GripBody = -1,
Invalid_GripBody = 0,
}

enum GripJSONValue {
Invalid_GripJSONValue = 0,
}

/*
* JSON types
*/
enum GripJSONType
{
GripJSONNull = 1,
GripJSONString = 2,
GripJSONNumber = 3,
GripJSONObject = 4,
GripJSONArray = 5,
GripJSONBoolean = 6,
GripJSONError = 7,
};

enum GripResponseState {
GripResponseStateCancelled = 1,
GripResponseStateError = 2,
GripResponseStateSuccessful = 3,
GripResponseStateTimeout = 4,
}

enum GripHTTPStatus {
GripHTTPStatusContinue = 100,
GripHTTPStatusSwitchingProtocols = 101,
GripHTTPStatusProcessing = 102,
GripHTTPStatusOk = 200,
GripHTTPStatusCreated = 201,
GripHTTPStatusAccepted = 202,
GripHTTPStatusNonAuthoritativeInformation = 203,
GripHTTPStatusNoContent = 204,
GripHTTPStatusResetContent = 205,
GripHTTPStatusPartialContent = 206,
GripHTTPStatusMultiStatus = 207,
GripHTTPStatusAlreadyReported = 208,
GripHTTPStatusImUsed = 226,
GripHTTPStatusMultipleChoices = 300,
GripHTTPStatusMovedPermanently = 301,
GripHTTPStatusFound = 302,
GripHTTPStatusSeeOther = 303,
GripHTTPStatusNotModified = 304,
GripHTTPStatusUseProxy = 305,
GripHTTPStatusTemporaryRedirect = 307,
GripHTTPStatusPermanentRedirect = 308,
GripHTTPStatusBadRequest = 400,
GripHTTPStatusUnauthorized = 401,
GripHTTPStatusPaymentRequired = 402,
GripHTTPStatusForbidden = 403,
GripHTTPStatusNotFound = 404,
GripHTTPStatusMethodNotAllowed = 405,
GripHTTPStatusNotAcceptable = 406,
GripHTTPStatusProxyAuthenticationRequired = 407,
GripHTTPStatusRequestTimeout = 408,
GripHTTPStatusConflict = 409,
GripHTTPStatusGone = 410,
GripHTTPStatusLengthRequired = 411,
GripHTTPStatusPreconditionFailed = 412,
GripHTTPStatusPayloadTooLarge = 413,
GripHTTPStatusUriTooLong = 414,
GripHTTPStatusUnsupportedMediaType = 415,
GripHTTPStatusRangeNotSatisfiable = 416,
GripHTTPStatusExpectationFailed = 417,
GripHTTPStatusImATeapot = 418,
GripHTTPStatusMisdirectedRequest = 421,
GripHTTPStatusUnprocessableEntity = 422,
GripHTTPStatusLocked = 423,
GripHTTPStatusFailedDependency = 424,
GripHTTPStatusUpgradeRequired = 426,
GripHTTPStatusPreconditionRequired = 428,
GripHTTPStatusTooManyRequests = 429,
GripHTTPStatusRequestHeaderFieldsTooLarge = 431,
GripHTTPStatusUnavailableForLegalReasons = 451,
GripHTTPStatusInternalServerError = 500,
GripHTTPStatusNotImplemented = 501,
GripHTTPStatusBadGateway = 502,
GripHTTPStatusServiceUnavailable = 503,
GripHTTPStatusGatewayTimeout = 504,
GripHTTPStatusHttpVersionNotSupported = 505,
GripHTTPStatusVariantAlsoNegotiates = 506,
GripHTTPStatusInsufficientStorage = 507,
GripHTTPStatusLoopDetected = 508,
GripHTTPStatusNotExtended = 510,
GripHTTPStatusNetworkAuthenticationRequired = 511,
};

/**
* Gets state of the response.
*
* @note This has nothing to do with HTTP status codes.
*
* @return Returns current response state.
*/
native GripResponseState:grip_get_response_state();


/**
* Gets HTTP status code of the response.
*
* @return Returns current response state.
*/
native any:grip_get_response_status_code();

/**
* Returns whether request exists/active.
*
* @note This has nothing to do with HTTP status codes.
*
* @param request Request handle.
*
* @return Returns current response state.
*/
native grip_is_request_active(GripRequestCancellation:request);

/**
* Creates new body handle from string
*
* @note Body should be destroyed with the relevant call.
*
* @param str Zero terminated string from which body should be created
*
* @return Newly crated body handle
*/
native GripBody:grip_body_from_string(str[]);

/**
* Creates new body handle from string
*
* @note Body should be destroyed with the relevant call.
*
* @param str Zero terminated string from which body should be created
* @param pretty True to format pretty JSON string, false to not
* @param recursion_limit Limit of the internal recursion
*
* @return Newly crated body handle
*/
native GripBody:grip_body_from_json(GripJSONValue:value, bool:pretty = false, recursion_limit = 100);

/**
* Destroys body handle
*
* @param body Body to be destroyed
*
* @noreturn
*/
native grip_destroy_body(GripBody:body);

/**
* Starts sending of the request
* @note The handle should look like:
* public RequestHandler(const any: userData);
*
*
* @param uri Request URI. Supports TLS.
* @param type Request type which should be sended.
* @param body Reqeust body, can be either JSON or plaintext
* @param handler A callback which will be called when request finishes execution
* @param options Request options containing HTTP headers, timeout and so on..
* @param userData User data (can be datapack or anything)
*
* @return Cancellation handle.
*/
native GripRequestCancellation:grip_request(const uri[], GripBody:body, GripRequestType:type, const handler[], GripRequestOptions:options = Empty_GripRequestOptions, const any: userData = 0);

/**
* Cancel sending of the request and receiving of response.
*
* @param cancellation Cancellation handle of the request.
*
* @return Request handle
*/
native grip_cancel_request(GripRequestCancellation:cancellation);

/**
* Get current error description. Implementation defined.
*
* @note There are certain AMXX limitations to maximum string sizes.
*
* @param buffer Output buffer to which description should be written
* @param buffer_size Maximum length of the buffer.
*
* @return Number of cells written
*/
native grip_get_error_description(buffer[], buffer_size);

/**
* Get current response body as string.
*
* @note There are certain AMXX limitations to maximum string sizes.
*
* @param buffer Output buffer to which body should be written
* @param buffer_size Maximum length of the buffer.
*
* @return Number of cells written
*/
native grip_get_response_body_string(buffer[], buffer_size);

/**
* Destroy this JSON value
*
* @param json_value JSON Value to be destroyed.
*
* @noreturn
*/
native grip_destroy_json_value(GripJSONValue:grip_json_value);

/**
* Create options with empty headers and some timeout.
*
* @note Options should be destroyed with the relevant call.
*
* @param timeout timeout -1 to disable, >0 to enable timeout.
*
* @return Request options handle.
*/
native GripRequestOptions:grip_create_default_options(Float:timeout = -1.0);

/**
* Destroy this options
*
* @noreturn
*/
native grip_destroy_options(GripRequestOptions:options);

/**
* Add HTTP Header to this options.
*.
* @param options Options to which header should be added
* @param headerName Header name
* @param headerValue Header value
*
* @return Request options handle.
*/
native grip_options_add_header(GripRequestOptions:options, const headerName[], const headerValue[]);


/**
* Create options with headers and some timeout.
*
* @note Options should be destroyed with the relevant call.
*
* @param headers Array of header pairs.
* @param headers_count Count of the header pairs.
* @param timeout timeout -1 to disable, >0 to enable timeout.
*
* @return Request options handle.
*/
stock grip_create_create_options(const headers[][2][], const headers_count, Float:timeout = -1.0) {
new GripRequestOptions:options = grip_create_default_options(timeout);

for(new i = 0; i < headers_count; ++i) {
grip_options_add_header(options, headers[i][0], headers[i][1]);
}

return options;
}

/**
* Parse current response body as JSON.
*
* @param buffer Output buffer to which possible error should be written
* @param error_buffer_size Maximum length of the buffer.
*
*
* @return JSON Value handle. If error occurred, returns invalid handle.
*/
native GripJSONValue:grip_json_parse_response_body(error_buffer[], const error_buffer_size);

/**
* Parses string that contains JSON.
*
* @note Needs to be destroyed using grip_destroy_json_value() native.
*
* @param string String to parse
* @param buffer Output buffer to which possible error should be written
* @param error_buffer_size Maximum length of the buffer.
*
* @return JSON value, Invalid_GripJSONValue if error occurred
*/
native GripJSONValue:grip_json_parse_string(const string[], error_buffer[], const error_buffer_size);

/**
* Parses file that contains JSON.
*
* @note Needs to be destroyed using grip_destroy_json_value() native.
*
* @param string String to parse
*
* @return JSON value, Invalid_GripJSONValue if error occurred
*/
native GripJSONValue:grip_json_parse_file(const file[], error_buffer[], const error_buffer_size);

/**
* Checks if the first value is the same as the second one.
*
* @param value1 JSON handle
* @param value2 JSON handle
*
* @return True if they are the same, false otherwise
* @error If passed value is not a valid handle
*/
native bool:grip_json_equals(const GripJSONValue:value1, const GripJSONValue:value2);

/**
* Validates json by checking if object have identically named
* fields with matching types.
*
* @note Schema {"name":"", "age":0} will validate
* {"name":"Joe", "age":25} and {"name":"Joe", "age":25, "gender":"m"},
* but not {"name":"Joe"} or {"name":"Joe", "age":"Cucumber"}.
*
* @note In case of arrays, only first value in schema
* is checked against all values in tested array.
*
* @note Empty objects ({}) validate all objects,
* empty arrays ([]) validate all arrays,
* null validates values of every type.
*
* @param schema JSON handle
* @param value JSON handle
*
* @return True if passed value is valid, false otherwise
* @error If a schema handle or value handle is invalid
*/
native bool:grip_json_validate(const GripJSONValue:schema, const GripJSONValue:value);

/**
* Gets value's parent handle.
*
* @note Parent's handle Needs to be destroyed using grip_destroy_json_value() native.
*
* @param value JSON handle
*
* @return Parent's handle
*/
// This method is wontfix, because of mixed value/ref semantics of json.inc
// native GripJSONValue:grip_json_get_parent(const GripJSONValue:value);

/**
* Gets JSON type of passed value.
*
* @param value JSON handle
*
* @return JSON type (GripJSONType constants)
* @error If a value handle is invalid
*/
native GripJSONType:grip_json_get_type(const GripJSONValue:value);

/**
* Inits an empty object.
*
* @note Needs to be destroyed using grip_destroy_json_value() native.
*
* @return JSON handle, Invalid_GripJSONValue if error occurred
*/
native GripJSONValue:grip_json_init_object();

/**
* Inits an empty array.
*
* @note Needs to be destroyed using grip_destroy_json_value() native.
*
* @return JSON handle, Invalid_GripJSONValue if error occurred
*/
native GripJSONValue:grip_json_init_array();

/**
* Inits string data.
*
* @note Needs to be destroyed using grip_destroy_json_value() native.
*
* @param value String that the handle will be initialized with
*
* @return JSON handle, Invalid_GripJSONValue if error occurred
*/
native GripJSONValue:grip_json_init_string(const value[]);

/**
* Inits a number.
*
* @note Needs to be destroyed using grip_destroy_json_value() native.
*
* @param value Integer number that the handle will be initialized with
*
* @return JSON handle, Invalid_GripJSONValue if error occurred
*/
native GripJSONValue:grip_json_init_number(value);

/**
* Inits a float number.
*
* @note Needs to be destroyed using grip_destroy_json_value() native.
*
* @param value Float number that the handle will be initialized with
*
* @return JSON handle, Invalid_GripJSONValue if error occurred
*/
native GripJSONValue:grip_json_init_float(Float:value);
#define grip_json_init_real(%1) grip_json_init_float(%1)

/**
* Inits a boolean value.
*
* @note Needs to be destroyed using grip_destroy_json_value() native.
*
* @param value Boolean value that the handle will be initialized with
*
* @return JSON handle, Invalid_GripJSONValue if error occurred
*/
native GripJSONValue:grip_json_init_bool(bool:value);

/**
* Inits a null.
*
* @note Needs to be destroyed using grip_destroy_json_value() native.
*
* @return JSON handle, Invalid_GripJSONValue if error occurred
*/
native GripJSONValue:grip_json_init_null();

/**
* Creates deep copy of passed value.
*
* @note Needs to be destroyed using grip_destroy_json_value() native.
*
* @param value JSON handle to be copied
*
* @return JSON handle, Invalid_GripJSONValue if error occurred
* @error If passed value is not a valid handle
*/
native GripJSONValue:grip_json_deep_copy(const GripJSONValue:value);

/**
* Gets string data.
*
* @param value JSON handle
* @param buffer Buffer to copy string to
* @param maxlen Maximum size of the buffer
*
* @return The number of cells written to the buffer
* @error If passed value is not a valid handle
*/
native grip_json_get_string(const GripJSONValue:value, buffer[], maxlen);

/**
* Gets a number.
*
* @param value JSON handle
*
* @return Number
* @error If passed value is not a valid handle
*/
native grip_json_get_number(const GripJSONValue:value);

/**
* Gets a float number.
*
* @param value JSON handle
*
* @return Real number
* @error If passed value is not a valid handle
*/
#define grip_json_get_real(%1) grip_json_get_float(%1)
native Float:grip_json_get_float(const GripJSONValue:value);

/**
* Gets a boolean value.
*
* @param value JSON handle
*
* @return Boolean value
* @error If passed value is not a valid handle
*/
native bool:grip_json_get_bool(const GripJSONValue:value);

/**
* Gets a value from the array.
*
* @note Needs to be destroyed using grip_destroy_json_value() native.
*
* @param array Array handle
* @param index Position in the array (starting from 0)
*
* @return JSON handle, Invalid_GripJSONValue if error occurred
* @error If passed handle is not a valid array
*/
native GripJSONValue:grip_json_array_get_value(const GripJSONValue:array, index);

/**
* Gets string data from the array.
*
* @param array Array handle
* @param index Position in the array (starting from 0)
* @param buffer Buffer to copy string to
* @param maxlen Maximum size of the buffer
*
* @return The number of cells written to the buffer
* @error If passed handle is not a valid array
*/
native grip_json_array_get_string(const GripJSONValue:array, index, buffer[], buffer_size);

/**
* Gets a number from the array.
*
* @param array Array handle
* @param index Position in the array (starting from 0)
*
* @return The number as integer
* @error If passed handle is not a valid array
*/
native grip_json_array_get_number(const GripJSONValue:array, index);

/**
* Gets a real number from the array.
*
* @param array Array handle
* @param index Position in the array (starting from 0)
*
* @return The number as float
* @error If passed handle is not a valid array
*/
#define grip_json_array_get_real(%1, %2) grip_json_array_get_float(%1, %2)
native Float:grip_json_array_get_float(const GripJSONValue:array, index);

/**
* Gets a boolean value from the array.
*
* @param array Array handle
* @param index Position in the array (starting from 0)
*
* @return Boolean value
* @error If passed handle is not a valid array
*/
native bool:grip_json_array_get_bool(const GripJSONValue:array, index);

/**
* Gets count of the elements in the array.
*
* @param array Array handle
*
* @return Number of elements in the array
* @error If passed handle is not a valid array
*/
native grip_json_array_get_count(const GripJSONValue:array);

/**
* Replaces an element in the array with value.
*
* @param array Array handle
* @param index Position in the array to be replaced
* @param value JSON handle to set
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid array
*/
native bool:grip_json_array_replace_value(GripJSONValue:array, index, const GripJSONValue:value);

/**
* Replaces an element in the array with string data.
*
* @param array Array handle
* @param index Position in the array to be replaced
* @param string String to copy
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid array
*/
native bool:grip_json_array_replace_string(GripJSONValue:array, index, const string[]);

/**
* Replaces an element in the array with number.
*
* @param array Array handle
* @param index Position in the array to be replaced
* @param number Number to set
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid array
*/
native bool:grip_json_array_replace_number(GripJSONValue:array, index, number);

/**
* Replaces an element in the array with real number.
*
* @param array Array handle
* @param index Position in the array to be replaced
* @param number Real number to set
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid array
*/
native bool:grip_json_array_replace_float(GripJSONValue:array, index, Float:number);
#define grip_json_array_replace_real(%1, %2, %2) grip_json_array_replace_float(%1, %2, %3)

/**
* Replaces an element in the array with boolean value.
*
* @param array Array handle
* @param index Position in the array to be replaced
* @param boolean Boolean value to set
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid array
*/
native bool:grip_json_array_replace_bool(GripJSONValue:array, index, bool:boolean);

/**
* Replaces an element in the array with null.
*
* @param array Array handle
* @param index Position in the array to be replaced
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid array
*/
native bool:grip_json_array_replace_null(GripJSONValue:array, index);

/**
* Appends a value in the array.
*
* @param array Array handle
* @param value JSON handle to set
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid array
*/
native bool:grip_json_array_append_value(GripJSONValue:array, const GripJSONValue:value);

/**
* Appends string data in the array.
*
* @param array Array handle
* @param string String to copy
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid array
*/
native bool:grip_json_array_append_string(GripJSONValue:array, const string[]);

/**
* Appends a number in the array.
*
* @param array Array handle
* @param number Number to set
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid array
*/
native bool:grip_json_array_append_number(GripJSONValue:array, number);

/**
* Appends a real number in the array.
*
* @param array Array handle
* @param number Real number to set
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid array
*/
native bool:grip_json_array_append_float(GripJSONValue:array, Float:number);
#define grip_json_array_append_real(%1, %2, %3) grip_json_array_append_float(%1, %2, %3)

/**
* Appends a boolean value in the array.
*
* @param array Array handle
* @param boolean Boolean value to set
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid array
*/
native bool:grip_json_array_append_bool(GripJSONValue:array, bool:boolean);

/**
* Appends a null in the array.
*
* @param array Array handle
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid array
*/
native bool:grip_json_array_append_null(GripJSONValue:array);

/**
* Removes an element from the array.
*
* @note Order of values in array may change during execution.
*
* @param array Array handle
* @param index Position in the array (starting from 0)
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid array
*/
native bool:grip_json_array_remove(GripJSONValue:array, index);

/**
* Removes all elements from the array.
*
* @param array Array handle
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid array
*/
native bool:grip_json_array_clear(GripJSONValue:array);

/**
* Gets a value from the object.
*
* @note Needs to be destroyed using grip_destroy_json_value() native.
* @note If dot notation is used some values may be inaccessible
* because valid names in JSON can contain dots.
*
* @param object Object handle
* @param name Key name
* @param dot_not True to use dot notation, false to not
*
* @return JSON handle, Invalid_GripJSONValue if error occurred
* @error If passed handle is not a valid object
*/
native GripJSONValue:grip_json_object_get_value(const GripJSONValue:object, const name[], bool:dot_not = false);

/**
* Gets string data from the object.
*
* @note If dot notation is used some values may be inaccessible
* because valid names in JSON can contain dots.
*
* @param object Object handle
* @param name Key name
* @param buffer Buffer to copy string to
* @param maxlen Maximum size of the buffer
* @param dot_not True to use dot notation, false to not
*
* @return The number of cells written to the buffer
* @error If passed handle is not a valid object
*/
native grip_json_object_get_string(const GripJSONValue:object, const name[], buffer[], maxlen, bool:dot_not = false);

/**
* Gets a number from the object.
*
* @note If dot notation is used some values may be inaccessible
* because valid names in JSON can contain dots.
*
* @param object Object handle
* @param name Key name
* @param dot_not True to use dot notation, false to not
*
* @return Number
* @error If passed handle is not a valid object
*/
native grip_json_object_get_number(const GripJSONValue:object, const name[], bool:dot_not = false);

/**
* Gets a real number from the object.
*
* @note If dot notation is used some values may be inaccessible
* because valid names in JSON can contain dots.
*
* @param object Object handle
* @param name Key name
* @param dot_not True to use dot notation, false to not
*
* @return Real number
* @error If passed handle is not a valid object
*/
native Float:grip_json_object_get_float(const GripJSONValue:object, const name[], bool:dot_not = false);
#define grip_json_object_get_real(%1, %2, %3) grip_json_object_get_float(%1, %2, %3)

/**
* Gets a boolean value from the object.
*
* @note If dot notation is used some values may be inaccessible
* because valid names in JSON can contain dots.
*
* @param object Object handle
* @param name Key name
* @param dot_not True to use dot notation, false to not
*
* @return Boolean value
* @error If passed handle is not a valid object
*/
native bool:grip_json_object_get_bool(const GripJSONValue:object, const name[], bool:dot_not = false);

/**
* Gets count of the keys in the object.
*
* @param object Object handle
*
* @return Keys count
* @error If passed handle is not a valid object
*/
native grip_json_object_get_count(const GripJSONValue:object);

/**
* Gets name of the object's key.
*
* @param object Object handle
* @param index Position from which get key name
* @param buffer Buffer to copy string to
* @param maxlen Maximum size of the buffer
*
* @return The number of cells written to the buffer
* @error If passed handle is not a valid object
*/
native grip_json_object_get_name(const GripJSONValue:object, index, buffer[], maxlen);

/**
* Gets a value at the specified position from the object.
*
* @note Needs to be destroyed using grip_destroy_json_value() native.
*
* @param object Object handle
* @param index Position from which get key name
*
* @return JSON handle, Invalid_GripJSONValue if error occurred
* @error If passed handle is not a valid object
*/
native GripJSONValue:grip_json_object_get_value_at(const GripJSONValue:object, index);

/**
* Checks if the object has a value with a specific name and type.
*
* @param object Object handle
* @param name Key name
* @param type Type of value, if JSONError type will not be checked
* @param dot_not True to use dot notation, false to not
*
* @return True if has, false if not
* @error If passed handle is not a valid object
*/
native bool:grip_json_object_has_value(const GripJSONValue:object, const name[], GripJSONType:type = GripJSONError, bool:dot_not = false);

/**
* Sets a value in the object.
*
* @note If dot notation is used some values may be inaccessible
* because valid names in JSON can contain dots.
* @note It also removes the old value if any.
*
* @param object Object handle
* @param name Key name
* @param value JSON handle to set
* @param dot_not True to use dot notation, false to not
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid object
*/
native bool:grip_json_object_set_value(GripJSONValue:object, const name[], const GripJSONValue:value, bool:dot_not = false);

/**
* Sets string data in the object.
*
* @note If dot notation is used some values may be inaccessible
* because valid names in JSON can contain dots.
* @note It also removes the old value if any.
*
* @param object Object handle
* @param name Key name
* @param string String to copy
* @param dot_not True to use dot notation, false to not
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid object
*/
native bool:grip_json_object_set_string(GripJSONValue:object, const name[], const string[], bool:dot_not = false);

/**
* Sets a number in the object.
*
* @note If dot notation is used some values may be inaccessible
* because valid names in JSON can contain dots.
* @note It also removes the old value if any.
*
* @param object Object handle
* @param name Key name
* @param number Number to set
* @param dot_not True to use dot notation, false to not
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid object
*/
native bool:grip_json_object_set_number(GripJSONValue:object, const name[], number, bool:dot_not = false);

/**
* Sets a real number in the object.
*
* @note If dot notation is used some values may be inaccessible
* because valid names in JSON can contain dots.
* @note It also removes the old value if any.
*
* @param object Object handle
* @param name Key name
* @param number Real number to set
* @param dot_not True to use dot notation, false to not
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid object
*/
native bool:grip_json_object_set_float(GripJSONValue:object, const name[], Float:number, bool:dot_not = false);
#define grip_json_object_set_real(%1, %2, %3, %4) grip_json_object_set_float(%1, %2, %3, %4)

/**
* Sets a boolean value in the object.
*
* @note If dot notation is used some values may be inaccessible
* because valid names in JSON can contain dots.
* @note It also removes the old value if any.
*
* @param object Object handle
* @param name Key name
* @param boolean Boolean value to set
* @param dot_not True to use dot notation, false to not
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid object
*/
native bool:grip_json_object_set_bool(GripJSONValue:object, const name[], bool:boolean, bool:dot_not = false);

/**
* Sets a null in the object.
*
* @note If dot notation is used some values may be inaccessible
* because valid names in JSON can contain dots.
* @note It also removes the old value if any.
*
* @param object Object handle
* @param name Key name
* @param dot_not True to use dot notation, false to not
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid object
*/
native bool:grip_json_object_set_null(GripJSONValue:object, const name[], bool:dot_not = false);

/**
* Removes a key and its value in the object.
*
* @note If dot notation is used some values may be inaccessible
* because valid names in JSON can contain dots.
*
* @param object Object handle
* @param name Key name
* @param dot_not True to use dot notation, false to not
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid object
*/
native bool:grip_json_object_remove(GripJSONValue:object, const name[], bool:dot_not = false);

/**
* Removes all keys and their values in the object.
*
* @param object Object handle
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid object
*/
native bool:grip_json_object_clear(GripJSONValue:object);

/**
* Gets size of serialization.
*
* @param value JSON handle
* @param pretty True to count size for pretty format, false to not
* @param null_byte True to include null byte, false to not
* @param recursion_limit Limit of the internal recursion
*
* @return Size of serialized string
* @error If passed handle is not a valid value
*/
native grip_json_serial_size(const GripJSONValue:value, bool:pretty = false, bool:null_byte = false, recursion_limit = 100);

/**
* Copies serialized string to the buffer.
*
* @param value JSON handle
* @param buffer Buffer to copy string to
* @param maxlen Maximum size of the buffer
* @param pretty True to format pretty JSON string, false to not
* @param recursion_limit Limit of the internal recursion
*
* @return The number of cells written to the buffer
* @error If passed handle is not a valid value
*/
native grip_json_serial_to_string(const GripJSONValue:value, buffer[], maxlen, bool:pretty = false, recursion_limit = 100);

/**
* Copies serialized string to the file.
*
* @param value JSON handle
* @param file Path to the file
* @param pretty True to format pretty JSON string, false to not
* @param recursion_limit Limit of the internal recursion
*
* @return True if succeed, false otherwise
* @error If passed handle is not a valid value
*/
native bool:grip_json_serial_to_file(const GripJSONValue:value, const file[], bool:pretty = false, recursion_limit = 100);


Установка

1. Скопируйте модуль grip_amxx_i386.so в директорию: amxmodx/scripting/modules/
2. Скопируйте файл настроек grip.ini в директорию /amxmodx/configs/
3. Скопируйте инклуд grip.inc в директорию: amxmodx/scripting/include


Загрузки
- Последний релиз
- Исходный код
adva, BaHeK, dehost, esterio, floricus, iShot, Legend21, mazdan, Metal Messiah, on1x, oxoTHuk., SISA
30.12.2016, 22:31 Плагины/модули/программы на заказ [АКЦИЯ, 2 заказа бесплатно]
Цитата
Цитата(TwinG @ 30.12.2016, 22:20) *
Ну что же ребятки. Начинаем развеивать мифы и легенды о честности данного скриптера.

История берет свое начало с 17.12.16 именно в этот день была совершена ошибка с моей стороны, а именно обращение к данному скриптеру с просьбой изменить/внести дополнения в уже имеющийся код мода режимов для deathrun сервера. Изначально я планировал платно воспользоваться его услугами. Но тут он сообщил, что готов взяться и сделать все бесплатно, всего лишь за честный отзыв с моей стороны. Хотел честно? Получай! Изначально приоритетной работой, была работа с шопом. Уже на первых скринах 17.12.16 вы увидите, что данный скриптер с отличным настроем и позитивом соглашается на выполнение данной работы. После чего мы обговариваем общий фронт работ в которые входят следющие пункты: 1) Редактирование игровых режимов под новую версию мода + добавление моих идей указаных в тз. Тут же сразу подловить ТС на вранье и хочу попутно задать ему вопрос?! Выше ты написал, что реализовал, что-то большее чем указано в ТЗ. Хотелось бы знать, что это было и предоставление доказательств этого. Продолжаем. 2) Переписание шопа на API от мода (так же было указано в ТЗ) и как вы увидите позже на скринах. Тс успешно согласился с его выполнением (бесплатно). Шли дни тс потихоньку выполнял свою работу. В первую очередь он взялся за выполнение первой части ТЗ, что указана под цифрой 1 в данном повествовании. "Справился" за пару дней и тут начинается самое интересное. Начинают всплывать баги сделанные Тсом в ходе его изменений. Я конечно же в свою очередь начинаю писать ему с просьбами исправить данные недоработки. Основной недоработкой тса был криво исправленный информер. Немножко пошлого: до его изменений информер корректно работал, без каких либо багов. После его же исправлений: в первый раз: информер не появился вовсе и слал error логи. во-второй же раз - информер работал, но на такой карте как deathrun_arctic имеется дверь, которую возможно открыть кнопкой. Так вот после установки последнего фикса от тса эти двери начали гудеть как не нормальные. Как будто их открывают по 10 раз в секунду. Тс конечно сразу же начал все сплавлять на мою криворукость и т.д. Ладно х*й с ним с этим информером. Времени оставалось совсем мало и куда важнее было сделать то самое приоритетное задание указанное в тз "переписать шоп на API от мода". После просьбы выполнить данное условие. Тс ответил приблизительно следующее - я не обещал, листай переписку, ищи того чего нет. Но у нас то есть скриншоты. На которых все прекрасно видно, как данная личность согласилась с выполнением задания. ВНОВЬ ЛАДНО. Долгие диалоги с данной пустотой привели меня ни к чему. Все сошлось к тому, что он готов выполнить данный заказ и пофиксить все остальное только платно. (см. скриншоты). Опять же долгие дискуссии, куча потраченного времени и УРА мы добиваемся результата. Человек принимает 50% предоплаты, пишет, что заказ будет выполнен. Проходит 1-2 дня. Человек запрашивает модели (нужны были по тз). Кидаю модели и тут человек начинает вести себя уже совсем ... Пишет приблизительно следующее "у меня появился новый заказ на 1500 и уже внесли предоплату". Так что я не буду делать твой, кидай свой киви и я верну средства. Это по вашему нормально? Я сделал заказ. Ты его принял. Принял предоплату. Даже начал проводить уже какие-то работы по тз и тут ты мне заявляешь такое. Когда ты изначально знал про сроки и что я тебя просил сделать до нг. Ты ставишь меня в такое положение, что я должен срочно бегать, что-то искать и т.д. Подведем итоги: выполнение тз по акции не завершено, имеются баги. От заказа человек так просто отказался, когда предложили сумму выше. Человеку срать на клиентов, главное толстый кошелек. Так же хотелось бы сказать тебе следующее мой юный "друг" по поводу "чаевых" - о которых ты так яро намекал в нашем диалоге. По скриншотам ясно видно, что я тебе сказал следующее "чаевые конечно будут, НО за качественный и ЗАКОНЧЕННЫЙ заказ" - которого я по сей день не получил.

Маленькое лирическое отступление, что не поместилось в основной текст, но вы можете наблюдать это по скриншотам из переписки.
Человек угрожает бекдорами в коде и удалением файлов сервера при помощи них.
Человек всячески может пытаться спровоцировать вас на обострение ситуации.

Хочу привлечь внимание общественности и попросить заставить чутка поголодать, данного зажранного "скриптера" ввиду его некомпетентности и отвратительного отношения к своим клиентам. Иными словами: заказывать у него ничего не стоит, если же не хотите оказаться в такой же ситуации. На этому думаю стоит закончить. Если у вас есть какие либо вопросы или же вам нужны больше доказательства. Личные сообщения никто не отменял)

Самое вкусное
[attachment=42843:пруфы.rar]

Не буду особо продолжать, так как, кому интересно и кто будет это всё читать, тот сам всё посмотрит, скрины и договоренность о которой автор цитаты забыл и т.д..
Только вот хочу сказать, так как предполагаю, что возможно автор цитаты не понял шутки с бекдорами. Бекдоров нет, какие уязвимости линукс, бекдоры и т.д? (я пошутил, мол через плагин можно ядро пропатчить, удалить его сервер и всё в таком духе dntknw.gif )
EvilSMS
30.12.2016, 18:28 Плагины/модули/программы на заказ [АКЦИЯ, 2 заказа бесплатно]
Мне TwinG угрожал, мол напишет что-то про меня на форуме, так что пишу заранее небольшую историю нашей с ним работы․
Его оригинальный отзыв

Изначально мы договорились не переписывать плагин шопа, он согласился.
Скрин

С телефона, немного старый, так как столько переписки быстро перелистать сложно (мб кто-то знает способ, но не я)


Потом стал возмущаться и требовать, чтобы я сделал shop и мол он согласился в общем плане и, что в ТЗ shop был, но как видно из скрина, он сам согласился потом отдельным пунктом исключить shop (буквально цитирую его слова).
Я ему объяснил, что всё идёт в рамках договорённости, а отдельные фичи, которые я сделал в качестве подарка и которые не указаны в ТЗ это лично моё дело․
И таких фич не мало, некоторые вещи в плагинах являются моими идеами, в рамках разумного я не прошу денег(так как невсегда, чтобы ты задумываешь бывает практично) )

После завершения нашей работы и в процессе, я фиксил все баги, которые он мне присылал (может некоторые забыл, но не суть)
В процессе этого, он обнаружил, что из-за нового информера скрипят двери․ Я ему объяснил, что я изменил лишь вывод в HUD, %s заменил на %L
для поддержки мультиязычности и мол это не может быть причиной скрипа дверей․ Он не понял и до сегодняшнего дня не может это понять․ Возможно из-за замены информера и скрипят двери, но это вызвано другим чем-то․

Наша формальная работа по акции закончилась, но он и дальше пытался получить бесплатно, хоть и получал постоянный отказ․
Я человек спокойный, но меня можно вывести из себя таким поведением, которые продолжалось примерно 10(!) дней․
В конце вот, что случилось․
Все остольные скрины
Тут скрины только важной для понимания части, ниже не скинул, так как там у меня батхёрт лёгкий․ https://imgur.com/a/ptEGc

Я ему всё сказал насчёт того, что было и какой он проблемный клиент для меня. Я ему напомнил,мол он обещал после заказа дать чаевые) Потом по его просьбе кинул Qiwi кошелёк, я писал, что ПОСЛЕ НГ смогу сделать заказ и сам не соглашался․ Я не стал продолжать и дал только обещание начиная с "возможно ...", но он требовал до НГ. Я согласился, но позже передумал (да, тут мой косяк, но я бы все равно не сделал бы до НГ) и вернул ему деньги, а он опять начал своё)
EvilSMS, pist0nchik
30.12.2016, 11:32 Установить лимит на использование маркера
Цитата(nikson1337 @ 27.12.2016, 22:19) *
Очень надеялся что получиться но не помогло может у вас еще есть идеи как можно сделать?

nikson1337,
Конечно не помогло, простое бессмысленное для цели действие, к тому же вредное (reliable канал не стоит такими сообщениями заполнять)․
Не знаю, чем ваш вариант отличается от оригинала, но взял оригинальный плагин․

Что изменил։
1. Исправлен баг, когда по непонятным причинам маркер зажимался, когда игрок мёртв
2․ Добавлено ограничение на количество нарисованных линий

#define MAX_BEAMPOINTS 120 // Максимальное кол-во линий
#define DECREASE_STEP 10 // Количество линий, которые удаляются из счётчика после 25․5 секунд (столько "жизнь" линии)

Чем меньше DECREASE_STEP, тем больше task-ов будет генерироваться, думаю значение 10 оптимально․
Возможно есть более лучшие варианты реализации, но мне пришёл первым на ум именно этот․

[attachment=42830:magic_marker.sma]
nikson1337
17.12.2016, 9:05 Santa Hats проверка на наличие флага
lolik,

Код:
public EventTeamInfo( ) {
new id = read_data( 1 ), iEntity = g_iHats[ id ];

->
Код:
public EventTeamInfo( ) {
new id = read_data( 1 ), iEntity = g_iHats[ id ];
if(is_user_admin(id))
return;


Код:
public FwdHamPlayerSpawn( const id ) {

->
Код:
public FwdHamPlayerSpawn( const id ) {
if(is_user_admin(id))
return;

csuser, Jelly
28.7.2016, 16:21 MyArena.ru
oxoTHuk.,
Cкрытый текст
я-то хоть признаю dntknw.gif
oxoTHuk.
28.7.2016, 7:34 MyArena.ru
Ну что за беда. Сам хостинг-то у них хороший, но тех. поддержка просто ужас )
Приходится 3-5 раз задавать вопрос, сравнивать ответы и в крайнем случае на форум писать, чтобы получить верный ответ на нужный вопрос.
BaJIepbI4
14.7.2016, 21:32 Плагины/модули/программы на заказ [АКЦИЯ, 2 заказа бесплатно]
Nebo, Да, для Linux/Mac/Windows.
Особо опыта работы с микроконтроллерами нет, но, если дадите повод, то научусь)
Nebo
14.7.2016, 9:08 Плагины/модули/программы на заказ [АКЦИЯ, 2 заказа бесплатно]
/del
soob, x1DD
12.7.2016, 9:12 помощь в плагине ad_manager
sergi, Логическая ошибка в плагине. Как максимальная длина буфера используется количество символов, а не настоящая длина. Автор перестарался с бессмысленными оптимизациями, которые по идеи должны наоборот замедлить плагин, за счёт того, что вызывается strlen(..). Совершенно бессмысленно.
Код:

public replace_all_tags(id, msg[])
{
static len, time; len = strlen(msg);
static string[32];

Заменить на ->
Код:

public replace_all_tags(id, msg[], len)
{
static time;
static string[32];


Код:
public Print_Color_Msg(id, msg[])
{
static cur_msg[192];
format(cur_msg, charsmax(cur_msg), msg);

replace_all_tags(id, cur_msg);

Заменить на ->
Код:

public Print_Color_Msg(id, msg[])
{
static cur_msg[192];
format(cur_msg, charsmax(cur_msg), msg);

replace_all_tags(id, cur_msg, charsmax(cur_msg));
cstriker
12.7.2016, 8:46 [Metamod] Ultimate unprecacher [Alpha 0.3]
energydance, получается так )
TheArtemMaps
12.7.2016, 8:28 [Metamod] Ultimate unprecacher [Alpha 0.3]
У кого падает сервер, нужно обновить Metamod до последней версии (1.21p**).
google.bsk, strelok93
11.7.2016, 18:06 MyArena.ru
Работаю с этим хостингом несколько месяцев. Почти всё устраивает. Сервер перезагружается за секунду, если бывают падения. FPS нормальный.
В целом всё хорошо, но есть несколько минусов:
- В Тех поддержке сидят парни, которые будут тебя убеждать, что у тебя стоит dproto, а не reunion, лишь, потому что ты не пользуешься установкой плагинов из панели. "Нет-нет, вы ошибаетесь, у вас не стоит reunion" cbf1b2bfde1a.gif
- HLTV сервер у меня постоянно выключается. Может я где-то туплю, но тех. поддержка несколько раз говорила, что мол настроила, а потом сказала, что вовсе "специалисты работают над решением проблемы".

9/10
OnlySteam
22.6.2016, 17:29 Обсуждение раскрутки cs сервера [Архив]
Для меня, лично с моим восприятием эти фрагменты выглядят как выдуманные оправдания

[19:23:58 | Edited 19:24:02] Евгений Хлестов: У меня к сожалению логи не остались (Т.к. логи очищаются, да и я сам зашел и проверил, что там реально была подмена) поэтому не чего доказывать не буду , возврат сделал. Всего наилучшего!

[17:03:07] Гл. Админ - VCL: в поиске стали только джаил серверакакие можно узнать ?
[17:03:08] Евгений Хлестов: Администратор в микро сказал "Поехали" Произошел редирект и подмена, после все сервера стали джаил в поиске
[17:03:16] Евгений Хлестов: нет, я просто сборку уже стер ту

[17:03:08] Евгений Хлестов: Администратор в микро сказал "Поехали" Произошел редирект и подмена, после все сервера стали джаил в поиске
[17:06:42 | Edited 17:08:21] Евгений Хлестов: Если вы узнаете как и что делал ваш администратор, я постараюсь вернуть вам место, тк это очень важно, мне интересно как защиту он прошел , а я бы защитился уж получше

Цитата(Fullserver @ 22.6.2016, 18:24) *
Inline, раз вернул, что же Вы еще хотите?

Уже ничего. Просто ответил на сообщение выше. Спасибо всем за помощь.
Energy

2 страниц V   1 2