hxp
2026-01-20 9bbff431b0f42a19ed6efe6b98164586b5984a20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package PyMongoDB.GMToolLogicProcess.Commands.GMT_BroadCast
#
# @todo:GM¹¤¾ßÃüÁî - ¹ã²¥
# @author hxp
# @date 2026-01-20
# @version 1.0
#
# ÏêϸÃèÊö: GM¹¤¾ßÃüÁî - ¹ã²¥
#
#-------------------------------------------------------------------------------
#"""Version = 2026-01-20 16:00"""
#-------------------------------------------------------------------------------
 
import ChConfig
import GameWorld
import DataRecordPack
import ChPyNetSendPack
import NetPackCommon
import PyGameData
import GMCommon
 
import datetime
 
Def_MaxBroadCast = 10  # ¹ã²¥×î´ó´æ´¢ÊýÁ¿
 
## ÊÕµ½gmÃüÁîÖ´ÐÐ
# @param gmCmdDict:gmÃüÁî×Öµä
# @return None 
def OnExec(gmCmdDict):
    broadCastMsg = gmCmdDict.get(GMCommon.Def_GMKey_BroadCastMsg, '')
    startTime = gmCmdDict.get(GMCommon.Def_GMKey_StartTime, '')
    endTime = gmCmdDict.get(GMCommon.Def_GMKey_EndTime, '')
    
    startDate = gmCmdDict.get(GMCommon.Def_GMKey_StartDate, '')
    endDate = gmCmdDict.get(GMCommon.Def_GMKey_EndDate, '')
    interval = GameWorld.ToIntDef(gmCmdDict.get(GMCommon.Def_GMKey_Interval, '1'), 1)
    interval = max(1, interval)
    isDelOthers = gmCmdDict.get(GMCommon.Def_GMKey_IsDelOthers, 0) == "on"
    
    if startDate == '' or startTime == '' or endDate == '' or endTime == '':
        # Ã»ÓÐÉèÖÃʱ¼ä£¬Ä¬ÈÏÁ¢¼´¹ã²¥Ò»´Î
        startTime = GameWorld.GetCurrentDataTimeStr()
        endTime = str(GameWorld.GetServerTime() + datetime.timedelta(seconds=59))
        endTime = endTime.strip().split(".")[0]
    else:
        startTime = startDate + " " + startTime
        endTime = endDate + ' ' + endTime
        
    if broadCastMsg == '' or endTime == '' or startTime == '':
        return GMCommon.Def_ParamErr
    
    # É¾³ý֮ǰµÄ´æ´¢µÄ¹ã²¥
    if isDelOthers:
        DelAllBroadCast()
        
    startDate = GameWorld.GetDateTimeByFormatStr(startTime, ChConfig.TYPE_Time_Format)
    endDate = GameWorld.GetDateTimeByFormatStr(endTime, ChConfig.TYPE_Time_Format)
    dateTime = GameWorld.GetServerTime()
 
    # ÅжÏʱ¼äÊÇ·ñÕýÈ·
    if CheckDate(startDate, endDate) or CheckDate(dateTime, endDate):
        return GMCommon.Def_InvalidTime
    
    startTime = GameWorld.ChangeTimeStrToNum(startTime)
    endTime = GameWorld.ChangeTimeStrToNum(endTime)
    
    # ·¢ËÍÏûÏ¢
    SetBroadCastInfo(startTime, endTime, interval, broadCastMsg, isDelOthers)
    
    # Á÷Ïò
    DataRecordPack.DR_ToolGMOperate(0, '', '', 'GMT_BroadCast', str(gmCmdDict))
    return GMCommon.Def_Success
 
def CheckDate(startDate, endDate):
    ## ÅжÏʱ¼äÊÇ·ñ´íÎó
    
    if not startDate or not endDate:
        return False
    
    if (endDate - startDate).days < 0:
        return True
    
    return False
 
def DelAllBroadCast():
    ## É¾³ý֮ǰµÄ´æ´¢µÄ¹ã²¥
    PyGameData.g_broadCastList = []
    return
 
def SetBroadCastInfo(startTime, endTime, interval, msg, isDelOthers):
    ## Ìí¼Ó¹ã²¥
    
    PyGameData.g_broadCastList.append([startTime, endTime, interval, msg])
    if len(PyGameData.g_broadCastList) > Def_MaxBroadCast:
        PyGameData.g_broadCastList = PyGameData.g_broadCastList[-Def_MaxBroadCast:]
        
    # ¹ã²¥ÔÚÏßÍæ¼Ò
    NetPackCommon.SendFackPackOnline(GetBroadPack(startTime, endTime, interval, msg, isDelOthers))
    return
 
def OnPlayerLogin(curPlayer):
    
    if PyGameData.g_broadCastList == []:
        return
    
    # ÅжÏʱ¼ä»ò»¹Ê£ÓàµÄ¹ã²¥
    tempList = []
 
    curTime = GameWorld.GetServerTime()
    for msgInfo in PyGameData.g_broadCastList:
        startTime, endTime, interval, msg = msgInfo
        
        dateTime = GameWorld.ChangeTimeNumToDatetime(endTime)
        
        if (dateTime - curTime).days < 0:
            continue
        
        # ÐèÒª´æ´¢µÄ¹ã²¥
        tempList.append(msgInfo)
        
        # Í¨Öª¿Í»§¶Ë£¬¹ã²¥ÄÚÈÝ
        NetPackCommon.SendFakePack(curPlayer, GetBroadPack(startTime, endTime, interval, msg))
        
    # ¸üй㲥Áбí
    PyGameData.g_broadCastList = tempList[:]
    return
 
def GetBroadPack(startTime, endTime, interval, msg, isDelOthers=False):
    packData = ChPyNetSendPack.tagBroadCastInfo()
    packData.Clear()
    packData.IsDelOthers = isDelOthers
    packData.StartTime = startTime
    packData.EndTime = endTime
    packData.Interval = interval
    packData.Msg = msg
    packData.MsgLen = len(msg)
    return packData