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 )
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 )