• 让Discuz!NT论坛API支持在回帖时指定UID


    准备工作:下载Discuz!NT源代码和DiscuzToolkit源代码。

    一、修改DiscuzToolkit中的Reply.cs文件,在里面新增加一个类Reply2继承自Reply(目是是增加一个UID字段):

        public class Reply2 : Reply {
    
            [JsonPropertyAttribute("uid")]
            public int Uid;
        }


    二、修改DiscuzToolkit中的DiscuzSession.cs文件,添加以下代码:

    public TopicReplyResponse TopicReply2(Reply2 reply)
            {
                List<DiscuzParam> param_list = new List<DiscuzParam>();
                if (session_info != null && !string.IsNullOrEmpty(session_info.SessionKey))
                    param_list.Add(DiscuzParam.Create("session_key", session_info.SessionKey));
    
                param_list.Add(DiscuzParam.Create("reply_info", JavaScriptConvert.SerializeObject(reply)));
                TopicReplyResponse trr = util.GetResponse<TopicReplyResponse>("topics.reply2", param_list.ToArray());
                return trr;
            }

    三、修改Discuz.Web.Services项目Discuz.Web.Services.API命名空间下的Reply类,添加与第一步相同的代码.

    四、修改Discuz.Web.Services项目Discuz.Web.Services.API.Action命名空间下的Topics类,添加下面的代码:

            public string Reply2()
            {
                if (Signature != GetParam("sig").ToString())
                {
                    ErrorCode = (int)ErrorType.API_EC_SIGNATURE;
                    return "";
                }
    
                //如果是桌面程序则需要验证用户身份
                if (this.App.ApplicationType == (int)ApplicationType.DESKTOP){
                    if (Uid < 1){
                        ErrorCode = (int)ErrorType.API_EC_SESSIONKEY;
                        return "";
                    }
                }
    
                if (CallId <= LastCallId){
                    ErrorCode = (int)ErrorType.API_EC_CALLID;
                    return "";
                }
    
                if (!CheckRequiredParams("reply_info")){
                    ErrorCode = (int)ErrorType.API_EC_PARAM;
                    return "";
                }
    
                Reply2 reply;
                try{
                    reply = JavaScriptConvert.DeserializeObject<Reply2>(GetParam("reply_info").ToString());
                }catch{
                    ErrorCode = (int)ErrorType.API_EC_PARAM;
                    return "";
                }
    
                if (reply == null || AreParamsNullOrZeroOrEmptyString(reply.Tid, reply.Fid, reply.Message)){
                    ErrorCode = (int)ErrorType.API_EC_PARAM;
                    return "";
                }
    
                if (reply.Title == null) reply.Title = string.Empty;
                this.Uid = reply.Uid;
                #region 主题是否存在,是否已关闭
                TopicInfo topicinfo = Discuz.Forum.Topics.GetTopicInfo(reply.Tid);
                if (topicinfo == null){
                    ErrorCode = (int)ErrorType.API_EC_PARAM;
                    return "";
                }
                if (topicinfo.Closed == 1){
                    ErrorCode = (int)ErrorType.API_EC_TOPIC_CLOSED;
                    return "";
                }
                #endregion
                #region 检测版块是否存在
                ForumInfo foruminfo = Discuz.Forum.Forums.GetForumInfo(reply.Fid);
                if (foruminfo == null){
                    ErrorCode = (int)ErrorType.API_EC_PARAM;
                    return "";
                }
                #endregion
                #region 用户组权限
                int groupid = 0;
                ShortUserInfo userinfo = Discuz.Forum.Users.GetShortUserInfo(Uid);
                if (userinfo == null)
                    groupid = 7;
                else
                    groupid = userinfo.Groupid;
                UserGroupInfo usergroupinfo = Discuz.Forum.UserGroups.GetUserGroupInfo(groupid);
    
                if (topicinfo.Readperm > usergroupinfo.Readaccess && topicinfo.Posterid != Uid && usergroupinfo.Radminid != 1 &&
                    (userinfo != null && !Utils.InArray(userinfo.Username, foruminfo.Moderators.Split(',')))){
                    ErrorCode = (int)ErrorType.API_EC_TOPIC_READ_PERM;
                    return "";
                    }
                #endregion
                #region 帖子需要密码:不适用于API
                if (foruminfo.Password != ""){
                    ErrorCode = (int)ErrorType.API_EC_FORUM_PASSWORD;
                    return "";
                }
                #endregion
                #region 用户权限
                if (!Discuz.Forum.Forums.AllowViewByUserId(foruminfo.Permuserlist, Uid)) //判断当前用户在当前版块浏览权限
                {
                    if (foruminfo.Viewperm == null || foruminfo.Viewperm == string.Empty)//当板块权限为空时,按照用户组权限
                    {
                        if (usergroupinfo.Allowvisit != 1){
                            ErrorCode = (int)ErrorType.API_EC_FORUM_PERM;
                            return "";
                        }
                    }else//当板块权限不为空,按照板块权限
                    {
                        if (!Discuz.Forum.Forums.AllowView(foruminfo.Viewperm, groupid)){
                            ErrorCode = (int)ErrorType.API_EC_FORUM_PERM;
                            return "";
                        }
                    }
                }
                #endregion
    
                //是否有回复的权限
                if (!Discuz.Forum.Forums.AllowReplyByUserID(foruminfo.Permuserlist, Uid))
                {
                    if (foruminfo.Replyperm == null || foruminfo.Replyperm == string.Empty)//当板块权限为空时根据用户组权限判断
                    {
                        // 验证用户是否有发表主题的权限
                        if (usergroupinfo.Allowreply != 1)
                        {
                            ErrorCode = (int)ErrorType.API_EC_REPLY_PERM;
                            return "";
                        }
                    }
                    else//板块权限不为空时根据板块权限判断
                    {
                        if (!Discuz.Forum.Forums.AllowReply(foruminfo.Replyperm, groupid))
                        {
                            ErrorCode = (int)ErrorType.API_EC_REPLY_PERM;
                            return "";
                        }
                    }
                }
    
    
                // 如果是受灌水限制用户, 则判断是否是灌水
                if (userinfo != null)
                {
                    string joindate = userinfo.Joindate;
    
                    if (Utils.StrDateDiffMinutes(joindate, Config.Newbiespan) < 0)
                    {
                        ErrorCode = (int)ErrorType.API_EC_FRESH_USER;
                        return "";
                    }
    
                }
    
                if (reply.Title.IndexOf(" ") != -1)
                {
                    ErrorCode = (int)ErrorType.API_EC_FRESH_USER;
                    return "";
                }
                else if (reply.Title.Length > 60)
                {
                    ErrorCode = (int)ErrorType.API_EC_FRESH_USER;
                    return "";
                }
    
                if (reply.Message.Length < Config.Minpostsize)
                {
                    ErrorCode = (int)ErrorType.API_EC_MESSAGE_LENGTH;
                    return "";
                }
                if (reply.Message.Length > Config.Maxpostsize)
                {
                    ErrorCode = (int)ErrorType.API_EC_MESSAGE_LENGTH;
                    return "";
                }
    
                //新用户广告强力屏蔽检查
                if ((Config.Disablepostad == 1) && usergroupinfo.Radminid < 1 || userinfo == null)  //如果开启新用户广告强力屏蔽检查或是游客
                {
                    if (userinfo == null || (Config.Disablepostadpostcount != 0 && userinfo.Posts <= Config.Disablepostadpostcount) ||
                        (Config.Disablepostadregminute != 0 && DateTime.Now.AddMinutes(-Config.Disablepostadregminute) <= Convert.ToDateTime(userinfo.Joindate)))
                    {
                        foreach (string regular in Config.Disablepostadregular.Replace("\r", "").Split('\n'))
                        {
                            if (Posts.IsAD(regular, reply.Title, reply.Message))
                            {
                                ErrorCode = (int)ErrorType.API_EC_SPAM;
                                return "";
                            }
                        }
                    }
                }
    
                if (ForumUtils.HasBannedWord(reply.Title) || ForumUtils.HasBannedWord(reply.Message))
                {
                    ErrorCode = (int)ErrorType.API_EC_SPAM;
                    return "";
                }
    
                PostInfo postInfo = PostReply(Uid, reply, usergroupinfo, userinfo, foruminfo, topicinfo.Title);
                if (topicinfo.Replies < (Config.Ppp + 9))
                {
                    ForumUtils.DeleteTopicCacheFile(topicinfo.Tid);
                }
    
                TopicReplyResponse trr = new TopicReplyResponse();
                trr.PostId = postInfo.Pid;
                trr.Url = ForumUrl + string.Format("showtopic.aspx?topicid={0}&page=end#{1}", reply.Tid, trr.PostId);
                trr.NeedAudit = postInfo.Invisible == 1;
    
                //同步到其他应用程序
                Sync.Reply(postInfo.Pid.ToString(), postInfo.Tid.ToString(), postInfo.Topictitle, postInfo.Poster, postInfo.Posterid.ToString(), postInfo.Fid.ToString(), ApiKey);
    
                if (Format == FormatType.JSON)
                {
                    return JavaScriptConvert.SerializeObject(trr);
                }
                return SerializationHelper.Serialize(trr);
            }

    现在,在您自己的项目中重新添加对DiscuzToolkit的引用,就可以使用Reply2回帖并指定用户名了!这样就不会出现Reply回帖显示没有权限的提示了!

  • 相关阅读:
    POJ3171 线段树优化dp
    Codeforces Round #590 (Div. 3)
    POJ2777 线段树区间染色问题
    POJ2182 Lost Cows 树状数组,二分
    P1908 逆序对 树状数组
    2019 Multi-University Training Contest 3
    主席树板子题区间第k小
    权值线段树板子题
    KMP板子题
    稀疏贝叶斯
  • 原文地址:https://www.cnblogs.com/Lexy/p/2537615.html
Copyright © 2020-2023  润新知