PDA

View Full Version : |Jobs/Query| Contagem de tempo online de conta + char (HOT)



cronusmaker
17/04/2019, 11:24 AM
funciona melhor em sql 2008+


Há tempos vejo pessoas pedindo query pra contar tempo online de char, então resolvi por a mão na massa e fazer uma.


Se houver bugs eu fixo, só avisar aqui, mas aparentemente está 100% (fiz inúmeros testes).[B]


A contagem é feita em segundos e é armazenada:


- Tempo da conta: na MEMB_INFO, coluna TimeON.
- Tempo de cada char: na Character, coluna TimeON.




O tempo online é atualizado:


- Quando você seleciona char (mesmo se não trocar de char).
- Quando você troca de char.
- Quando você desloga a conta.


Vamos lá.




[B]♦ Versões atuais dos Scripts:


- TRIGGER: 2.1.2
- WZ_DISCONNECT_MEMB: 2.0.0




[B]♦ ALTER TABLES


USE [MUOnline]GO
ALTER TABLE [dbo].[MEMB_STAT]ALTER COLUMN [ConnectTM] [datetime] NULLGO
ALTER TABLE [dbo].[MEMB_STAT]ALTER COLUMN [DisConnectTM] [datetime] NULLGO
ALTER TABLE [dbo].[MEMB_INFO]ADD [TimeON] [bigint] NOT NULL DEFAULT 0GO
ALTER TABLE [dbo].[Character]ADD [ConnectTM] [datetime] NULLGO
ALTER TABLE [dbo].[Character]ADD [DisConnectTM] [datetime] NULLGO
ALTER TABLE [dbo].[Character]ADD [TimeON] [bigint] DEFAULT ((0)) NOT NULLGO



♦ TRIGGER - AccountCharacter_Online



[Only registered and activated users can see links]
USE MuOnlineGO
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'AccountCharacter_Online' AND type = 'TR') DROP TRIGGER [AccountCharacter_Online]GO
CREATE TRIGGER [AccountCharacter_Online] ON [dbo].[AccountCharacter] AFTER UPDATE AS SET NOCOUNT ON
/*| Hipóteses| || 1 - Se GameIDC foi atualizado, algum char foi foi logado. Surgem hipóteses:|| 1.1 - GameIDC e Old_GameIDC são diferentes:| | 1.1.1 - Old_GameIDC é NULL, logo é o primeiro char logado (e possivelmente o primeiro criado) na conta, | pois não existe GameIDC anterior.| 1.1.2 - Já existe um GameIDC anterior, logo significa que o cara acessou outro char. Surgem 2 hipóteses:|| 1.1.2.1 - O cara simplesmente trocou de char sem deslogar a conta:| 1.1.2.1.1 - O cara logou um char, deletou ele e entrou em outro.| 1.1.2.2 - O cara relogou a conta e entrou em outro char.| 1.1.2.2.1 - O cara logou um char, deletou ele, saiu da conta, voltou e entrou em outro.| | 1.2 GameIDC e Old_GameIDC são iguais:| | 1.2.1 - O cara relogou o char.| 1.2.2 - O cara relogou a conta e entrou no mesmo char.|| 2. Se GameIDC não foi atualizado, não precisa fazer nada, porque significa:| | 2.1 - Que um char foi criado, mas não foi logado.| 2.2 - Que um char foi deletado sem nem mesmo ter sido logado.| | */
-- Hipótese 1IF UPDATE(GameIDC) BEGIN
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]



♦ PROCEDURE WZ_DISCONNECT_MEMB




[Only registered and activated users can see links]
USE MuOnlineGO
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'WZ_DISCONNECT_MEMB')DROP PROCEDURE [DBO].[WZ_DISCONNECT_MEMB]GO
[Only registered and activated users can see links]
SET NOCOUNT ON
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]

/*Selecionamos os momentos de login e logout da conta e convertemos para números inteiros.*/
[Only registered and activated users can see links]

/*Executamos os cálculos para obtermos o tempo total online da conta.*/
[Only registered and activated users can see links]
/*Atualizamos o tempo total online da conta.*/
[Only registered and activated users can see links]

/*Selecionando nick do último char logado*/
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
/*Verificação: quando foi o último connect desse char que acabou de deslogar?Se for nulo, significa que ocorreu algum problema na trigger, entãoadicionamos o valor de "agora" convertido em timestamp para possibilitar o cálculo.*/
[Only registered and activated users can see links]
/*Executamos os cálculos para obtermos o tempo total onlinedo último char logado.*/
[Only registered and activated users can see links]
/*Atualizamos o tempo total online do último char logado.*/
[Only registered and activated users can see links]
ENDENDENDSET NOCOUNT OFFEND





ATENÇÃO




Não me responsabilizo por uso incorreto.
Não me responsabilizo por eventuais deadlocks. Usem por conta e risco.


[Only registered and activated users can see links]


[]'s


Creditos Renato ( Imperyus )

Rey Mysterious
17/04/2019, 02:51 PM
funciona melhor em sql 2008+

Há tempos vejo pessoas pedindo query pra contar tempo online de char, então resolvi por a mão na massa e fazer uma.

Se houver bugs eu fixo, só avisar aqui, mas aparentemente está 100% (fiz inúmeros testes).

A contagem é feita em segundos e é armazenada:

- Tempo da conta: na MEMB_INFO, coluna TimeON.
- Tempo de cada char: na Character, coluna TimeON.


O tempo online é atualizado:

- Quando você seleciona char (mesmo se não trocar de char).
- Quando você troca de char.
- Quando você desloga a conta.

Vamos lá.


[B]♦ Versões atuais dos Scripts:

- TRIGGER: 2.1.2
- WZ_DISCONNECT_MEMB: 2.0.0


[B]♦ ALTER TABLES



USE [MUOnline]
GO

ALTER TABLE [dbo].[MEMB_STAT]
ALTER COLUMN [ConnectTM] [datetime] NULL
GO

ALTER TABLE [dbo].[MEMB_STAT]
ALTER COLUMN [DisConnectTM] [datetime] NULL
GO

ALTER TABLE [dbo].[MEMB_INFO]
ADD [TimeON] [bigint] NOT NULL DEFAULT 0
GO

ALTER TABLE [dbo].[Character]
ADD [ConnectTM] [datetime] NULL
GO

ALTER TABLE [dbo].[Character]
ADD [DisConnectTM] [datetime] NULL
GO

ALTER TABLE [dbo].[Character]
ADD [TimeON] [bigint] DEFAULT ((0)) NOT NULL
GO



♦ TRIGGER - AccountCharacter_Online



/*
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
*/

USE MuOnline
GO

IF EXISTS (SELECT name FROM sysobjects WHERE name = 'AccountCharacter_Online' AND type = 'TR')
DROP TRIGGER [AccountCharacter_Online]
GO

CREATE TRIGGER [AccountCharacter_Online] ON [dbo].[AccountCharacter]
AFTER UPDATE AS
SET NOCOUNT ON

/*
| Hipóteses
|
|
| 1 - Se GameIDC foi atualizado, algum char foi foi logado. Surgem hipóteses:
|
| 1.1 - GameIDC e Old_GameIDC são diferentes:
|
| 1.1.1 - Old_GameIDC é NULL, logo é o primeiro char logado (e possivelmente o primeiro criado) na conta,
| pois não existe GameIDC anterior.
| 1.1.2 - Já existe um GameIDC anterior, logo significa que o cara acessou outro char. Surgem 2 hipóteses:
|
| 1.1.2.1 - O cara simplesmente trocou de char sem deslogar a conta:
| 1.1.2.1.1 - O cara logou um char, deletou ele e entrou em outro.
| 1.1.2.2 - O cara relogou a conta e entrou em outro char.
| 1.1.2.2.1 - O cara logou um char, deletou ele, saiu da conta, voltou e entrou em outro.
|
| 1.2 GameIDC e Old_GameIDC são iguais:
|
| 1.2.1 - O cara relogou o char.
| 1.2.2 - O cara relogou a conta e entrou no mesmo char.
|
| 2. Se GameIDC não foi atualizado, não precisa fazer nada, porque significa:
|
| 2.1 - Que um char foi criado, mas não foi logado.
| 2.2 - Que um char foi deletado sem nem mesmo ter sido logado.
|
|
*/

-- Hipótese 1
IF UPDATE(GameIDC) BEGIN

[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
account_DisconnectTM DATETIME,
account_DisconnectTM_Int INT,
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]

[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
SET account_DisconnectTM_Int = DATEDIFF(s, '19700101', account_DisconnectTM);

-- Hipótese 1.1
[Only registered and activated users can see links]

-- Hipótese 1.1.1
[Only registered and activated users can see links]

[Only registered and activated users can see links]

END
-- Hipótese 1.1.2
ELSE BEGIN

[Only registered and activated users can see links]
[Only registered and activated users can see links]

-- Hipótese 1.1.2.1
[Only registered and activated users can see links]

-- Verificação da Hipótese 1.1.2.1.1
[Only registered and activated users can see links]

[Only registered and activated users can see links]
[Only registered and activated users can see links]

[Only registered and activated users can see links]

[Only registered and activated users can see links]

END

END
-- Hipótese 1.1.2.2 e "fim" da Hipótese 1.1.2.1
-- A query é a mesma e um "else" é desnecessário.
/*
| Não é necessário atualizar tempo on, porque se o cara relogou a conta
| a WZ_DISCONNECT_MEMB já fez o serviço. Só precisamos atualizar o momento
| de connect do novo char.
*/
[Only registered and activated users can see links]

END

END
--Hipótese 1.2.
ELSE BEGIN
-- Apenas precaução...
[Only registered and activated users can see links]

/*
| Desnecessário checar se o char existe, porque se essa parte
| do script está sendo executada, é porque o char foi logado
| agora, logo é presumível que existe.
*/

[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]

-- Hipótese 1.2.1
[Only registered and activated users can see links]

[Only registered and activated users can see links]
[Only registered and activated users can see links]

END
-- Hipótese 1.2.2
ELSE BEGIN
/*
Não é necessário atualizar tempo on, porque se o cara relogou a conta
a WZ_DISCONNECT_MEMB já fez o serviço.
*/
[Only registered and activated users can see links]

END

END

END
SET NOCOUNT OFF
END



♦ PROCEDURE WZ_DISCONNECT_MEMB




/*
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
*/

USE MuOnline
GO

IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'WZ_DISCONNECT_MEMB')
DROP PROCEDURE [DBO].[WZ_DISCONNECT_MEMB]
GO

[Only registered and activated users can see links]

SET NOCOUNT ON

[Only registered and activated users can see links]
@ConnectStat TINYINT,
@LoginTime INT,
@LogoutTime INT,
@ConnectTM INT,
@DisConnectTM INT,
@TimeON_Account BIGINT,
@TimeON_Char BIGINT,
@GameIDC VARCHAR(10),
@CharConnectTM DATETIME,
@CharConnectTM_Int INT,
@Now DATETIME,
@Now_Int INT;

[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]

[Only registered and activated users can see links]

[Only registered and activated users can see links]

[Only registered and activated users can see links]


/*
Selecionamos os momentos de login e logout da conta e convertemos para números inteiros.
*/

[Only registered and activated users can see links]
[Only registered and activated users can see links]


/*
Executamos os cálculos para obtermos o tempo total online da conta.
*/

[Only registered and activated users can see links]

/*
Atualizamos o tempo total online da conta.
*/

[Only registered and activated users can see links]


/*
Selecionando nick do último char logado
*/

[Only registered and activated users can see links]

/*
Algum char foi logado antes de sair da conta.
Mesmo que o cara tenha logado na conta e criado o char, o GameIDC
só vai ser preenchido se o cara logar na conta.
Sendo assim, se GameIDC for NULL, indica que nenhum char
nunca foi logado nessa conta, então não tem necessidade de contar tempo on.
*/
[Only registered and activated users can see links]

/*
Verificamos se esse char existe.
Motivo: o cara pode ter clicado em "selecionar char", deletado o char
e depois deslogado da conta.
Se não existe, não precisa fazer nada.
*/
[Only registered and activated users can see links]

/*
Verificação: quando foi o último connect desse char que acabou de deslogar?
Se for nulo, significa que ocorreu algum problema na trigger, então
adicionamos o valor de "agora" convertido em timestamp para possibilitar o cálculo.
*/

[Only registered and activated users can see links]
[Only registered and activated users can see links]
[Only registered and activated users can see links]
END
/*
Se não for nulo, convertemos para timestamp.
*/
ELSE BEGIN
[Only registered and activated users can see links]
END

/*
Executamos os cálculos para obtermos o tempo total online
do último char logado.
*/

[Only registered and activated users can see links]

/*
Atualizamos o tempo total online do último char logado.
*/

[Only registered and activated users can see links]

END
END
END
SET NOCOUNT OFF
END




[B]ATENÇÃO


Não me responsabilizo por uso incorreto.
Não me responsabilizo por eventuais deadlocks. Usem por conta e risco.

[Only registered and activated users can see links]

[]'s

Creditos Renato ( Imperyus )


obrigado por tentar ajudar , quando executo a query da parte " TRIGGER - AccountCharacter_Online" acontece esse erro?


Msg 102, Level 15, State 1, Procedure AccountCharacter_Online, Line 56Incorrect syntax near 'MENTION=3039'.
Msg 137, Level 15, State 1, Procedure AccountCharacter_Online, Line 62
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 63
[Only registered and activated users can see links]
Msg 137, Level 15, State 1, Procedure AccountCharacter_Online, Line 64
[Only registered and activated users can see links]
Msg 137, Level 15, State 1, Procedure AccountCharacter_Online, Line 65
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 66
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 67
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 71
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 74
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 76
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 82
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 83
[Only registered and activated users can see links]
Msg 4145, Level 15, State 1, Procedure AccountCharacter_Online, Line 86
An expression of non-boolean type specified in a context where a condition is expected, near 'account'.
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 89
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 91
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 92
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 94
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 96
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 108
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 116
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 124
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 125
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 126
[Only registered and activated users can see links]
Msg 4145, Level 15, State 1, Procedure AccountCharacter_Online, Line 129
An expression of non-boolean type specified in a context where a condition is expected, near 'account'.
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 131
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 132
[Only registered and activated users can see links]
Msg 137, Level 15, State 2, Procedure AccountCharacter_Online, Line 141
[Only registered and activated users can see links]

cronusmaker
17/04/2019, 05:15 PM
qual a versão do seu sql ?

Rey Mysterious
17/04/2019, 07:50 PM
qual a versão do seu sql ? a versão é sql server 2014 enterprise

rengar157
21/04/2019, 02:49 PM
aqui tbm nao funciona.. sql server 2012.. mesmo erro do amigo acima..

cronusmaker
21/04/2019, 04:09 PM
vou postar la no topico original e ver se o cara responde
[Only registered and activated users can see links]

MENTION=3039

se puder trocar o nick do usuario para que esse conflito não ocorra em futuros posts pois isso prejudica qualquer query ou producere

Mentor
05/05/2020, 03:42 PM
vou postar la no topico original e ver se o cara responde
[Only registered and activated users can see links]

MENTION=3039

se puder trocar o nick do usuario para que esse conflito não ocorra em futuros posts pois isso prejudica qualquer query ou producere

Estarei verificando, pois não adianta editar o nick e outra pessoa cadastrar no fórum criando esse mesmo nick, estarei editando e buscando uma forma de bloquear a utilização desse nick.

Abraço!

____edit


Nickname mudado para acc0ount e Nick account bloqueado para uso, depois edite seu tópico para corrigir o problema.

cronusmaker
06/05/2020, 03:53 AM
a versão é sql server 2014 enterprise

aqui tbm nao funciona.. Sql server 2012.. Mesmo erro do amigo acima..
problema resolvido

traxxx
21/09/2020, 05:54 PM
funciona em mu emu s8?