让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回帖显示没有权限的提示了!

posted @ 2012-06-06 09:01  Lexy  阅读(1801)  评论(0)    收藏  举报